@mean-weasel/lineage 0.1.6 → 0.1.7
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/CHANGELOG.md +7 -0
- package/README.md +20 -0
- package/dist/cli/lineage-dev.js +1006 -41
- package/dist/cli/lineage-dev.js.map +4 -4
- package/dist/cli/lineage.js +1006 -41
- package/dist/cli/lineage.js.map +4 -4
- package/dist/server.js +1493 -540
- package/dist/server.js.map +4 -4
- package/dist/web/assets/{index-EfT3Ues-.css → index-38XlcMya.css} +1 -1
- package/dist/web/assets/index-CtsYIUyG.js +23 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -1
- package/dist/web/assets/index-NDba9I2v.js +0 -23
package/dist/server.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/server.ts", "../src/server/assetCore.ts", "../src/server/adapters/storage/s3StorageAdapter.ts", "../src/server/localReview.ts", "../src/server/assetLineageDb.ts", "../src/server/assetLedgerWorkflow.ts", "../src/server/assetLookup.ts", "../src/server/assetLineage.ts", "../src/server/assetLineageSelection.ts", "../src/server/
|
|
4
|
-
"sourcesContent": ["import express from 'express';\nimport multer from 'multer';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { archiveAsset, cleanupUploadedTemp, defaultProduct, deleteObjectGuarded, ensureUploadDir, isLineageAssetError, listAssets, listProjects, localPreviewPath, presignAsset, pullAsset, promoteAsset, repoRoot, uploadAsset, updatePlacement } from './server/assetCore';\nimport { isAssetLookupError, lookupAssets } from './server/assetLookup';\nimport {\n clearLineageRerollRequest,\n getLineageAttempts,\n getLineageChildren,\n getLineageNextAsset,\n getLineageSnapshot,\n indexLineageAssets,\n isLineageError,\n linkLineageAssets,\n listLineageRerollRequests,\n markLineageRerollRequest,\n promoteLineageAttempt,\n updateAssetReview,\n updateLineageLayout,\n updateSelectedAsset,\n} from './server/assetLineage';\nimport { getLineageBrief, linkSelectedLineageChild } from './server/assetLineageHandoff';\nimport { removeLineageNode } from './server/assetLineageRemove';\nimport { isLineageWorkspaceError } from './server/assetLineageWorkspaces';\nimport { getLedgerPageFromQuery } from './server/assetLedgerApi';\nimport { isAssetReviewError, markAssetReview, markAssetReviewsFromRequestBody, requireApprovedLocalBackupPath, withLocalReviewMetadata } from './server/assetReviews';\nimport { getReviewQueue } from './server/assetReviewQueue';\nimport { isAssetReviewSetError } from './server/assetReviewSets';\nimport { assetSelectionRouter, isAssetSelectionError } from './server/assetSelections';\nimport { isAgentClaimError } from './server/agentClaims';\nimport { claimTokenFromRequest, registerAgentClaimRoutes } from './server/agentClaimRoutes';\nimport { registerAdapterRoutes } from './server/adapters/adapterRoutes';\nimport { isAdapterSettingsError } from './server/adapters/adapterSettings';\nimport { isPostingAdapterError } from './server/adapters/posting/bufferPostingService';\nimport { contentBatchRouter } from './server/contentBatchRoutes';\nimport { isContentBatchError } from './server/contentBatches';\nimport { listImageGenerationJobs } from './server/generationReceiptJobs';\nimport { isGenerationReceiptError } from './server/generationReceipts';\nimport { registerLineageWorkspaceRoutes } from './server/lineageWorkspaceRoutes';\nimport type { AssetContentType, AssetReviewState, PlacementFields, PlacementStatus, UploadFields } from './shared/types';\nconst app = express();\nconst port = Number(process.env.PORT || 5173);\nconst host = process.env.HOST || 'lineage.localhost';\nconst isProduction = process.env.NODE_ENV === 'production';\nconst maxUploadBytes = Number(process.env.LINEAGE_MAX_UPLOAD_MB || 200) * 1024 * 1024;\nconst upload = multer({ dest: ensureUploadDir(), limits: { fileSize: maxUploadBytes } });\napp.use(express.json({ limit: '1mb' }));\nfunction projectFrom(input: { body?: Record<string, unknown>; query?: Record<string, unknown> }): string {\n const candidate = input.body?.project || input.body?.product || input.query?.project || input.query?.product;\n return typeof candidate === 'string' ? candidate : defaultProduct;\n}\n\nfunction asyncRoute(handler: (req: express.Request, res: express.Response) => Promise<void> | void): express.RequestHandler {\n return (req, res, next) => { Promise.resolve(handler(req, res)).catch(next); };\n}\napp.get('/api/projects', asyncRoute((_req, res) => { res.json({ projects: listProjects() }); }));\napp.get(\n '/api/assets',\n asyncRoute((req, res) => {\n const project = projectFrom(req);\n const snapshot = listAssets(project, {\n audience: typeof req.query.audience === 'string' ? req.query.audience : undefined,\n campaign: typeof req.query.campaign === 'string' ? req.query.campaign : undefined,\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n includeLive: req.query.live === 'true',\n page: Number(req.query.page || 1),\n pageSize: Number(req.query.pageSize || 10),\n placementStatus: typeof req.query.placementStatus === 'string' ? req.query.placementStatus : undefined,\n query: typeof req.query.q === 'string' ? req.query.q : undefined,\n source: typeof req.query.source === 'string' ? req.query.source : undefined,\n status: typeof req.query.status === 'string' ? req.query.status : undefined,\n type: typeof req.query.type === 'string' ? req.query.type : undefined,\n });\n res.json(withLocalReviewMetadata(project, snapshot));\n })\n);\napp.get('/api/ledger', asyncRoute((req, res) => { res.json(getLedgerPageFromQuery(projectFrom(req), req.query)); }));\napp.post('/api/assets/lookup', asyncRoute((req, res) => { res.json(lookupAssets(projectFrom(req), Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [])); }));\nregisterAdapterRoutes(app, projectFrom, asyncRoute);\nregisterAgentClaimRoutes(app, projectFrom, asyncRoute);\napp.use('/api/content', contentBatchRouter(projectFrom));\napp.use('/api/selections', assetSelectionRouter(projectFrom));\napp.get('/api/generation/jobs', asyncRoute((req, res) => { res.json(listImageGenerationJobs(projectFrom(req), { assetId: typeof req.query.assetId === 'string' ? req.query.assetId : undefined, rootAssetId: typeof req.query.rootAssetId === 'string' ? req.query.rootAssetId : undefined, limit: Number(req.query.limit || 12) })); }));\napp.get(\n '/api/review/queue',\n asyncRoute((req, res) => {\n res.json(\n getReviewQueue(projectFrom(req), {\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n limit: Number(req.query.limit || 6),\n })\n );\n })\n);\n\napp.get(\n '/api/assets/local-preview',\n asyncRoute((req, res) => {\n if (typeof req.query.path !== 'string') {\n res.status(400).json({ error: 'Local preview requires path' });\n return;\n }\n res.sendFile(localPreviewPath(req.query.path));\n })\n);\n\napp.post(\n '/api/index/local',\n asyncRoute((req, res) => {\n res.json({ ok: true, command: 'index local', project: projectFrom(req), summary: indexLineageAssets(projectFrom(req)) });\n })\n);\n\napp.get(\n '/api/lineage/:assetId/next',\n asyncRoute((req, res) => {\n res.json(getLineageNextAsset(projectFrom(req), req.params.assetId));\n })\n);\n\napp.get(\n '/api/lineage/:assetId/brief',\n asyncRoute((req, res) => {\n res.json(getLineageBrief(projectFrom(req), req.params.assetId));\n })\n);\n\napp.get(\n '/api/lineage/:assetId/children',\n asyncRoute((req, res) => {\n res.json(getLineageChildren(projectFrom(req), req.params.assetId));\n })\n);\n\nregisterLineageWorkspaceRoutes(app, projectFrom, asyncRoute);\n\napp.get('/api/lineage/:rootAssetId/rerolls', asyncRoute((req, res) => {\n res.json(listLineageRerollRequests(projectFrom(req), req.params.rootAssetId));\n}));\n\napp.post('/api/lineage/:rootAssetId/rerolls/:nodeAssetId', asyncRoute((req, res) => {\n res.json(markLineageRerollRequest(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n requestedBy: req.body.requestedBy === 'agent' || req.body.requestedBy === 'system' ? req.body.requestedBy : 'human',\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.post('/api/lineage/:rootAssetId/rerolls/:nodeAssetId/cancel', asyncRoute((req, res) => {\n res.json(clearLineageRerollRequest(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.get('/api/lineage/:rootAssetId/attempts/:nodeAssetId', asyncRoute((req, res) => {\n res.json(getLineageAttempts(projectFrom(req), req.params.rootAssetId, req.params.nodeAssetId));\n}));\n\napp.post('/api/lineage/:rootAssetId/attempts/:nodeAssetId/promote', asyncRoute((req, res) => {\n res.json(promoteLineageAttempt(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n attemptId: String(req.body.attemptId || ''),\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.get('/api/lineage/:assetId', asyncRoute((req, res) => { res.json(getLineageSnapshot(projectFrom(req), req.params.assetId)); }));\n\napp.post(\n '/api/lineage/link',\n asyncRoute((req, res) => {\n res.json(\n linkLineageAssets(projectFrom(req), {\n parentAssetId: String(req.body.parentAssetId || ''),\n childAssetId: String(req.body.childAssetId || ''),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post('/api/lineage/remove-node', asyncRoute((req, res) => {\n res.json(removeLineageNode(projectFrom(req), { assetId: String(req.body.assetId || ''), rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined, confirmWrite: req.body.confirmWrite === true, claimToken: claimTokenFromRequest(req) }));\n}));\n\napp.post(\n '/api/lineage/layout',\n asyncRoute((req, res) => {\n const positions = (Array.isArray(req.body.positions) ? req.body.positions : []) as Array<Record<string, unknown>>;\n res.json(\n updateLineageLayout(projectFrom(req), {\n rootAssetId: String(req.body.rootAssetId || ''),\n positions: positions.map(position => ({\n assetId: String(position.assetId || ''),\n x: Number(position.x),\n y: Number(position.y),\n })),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post(\n '/api/lineage/link-child',\n asyncRoute((req, res) => {\n res.json(\n linkSelectedLineageChild(projectFrom(req), {\n rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined,\n childAssetId: String(req.body.childAssetId || ''),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post(\n '/api/selection',\n asyncRoute((req, res) => {\n res.json(\n updateSelectedAsset(projectFrom(req), {\n assetId: typeof req.body.assetId === 'string' ? req.body.assetId : undefined,\n assetIds: Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : undefined,\n rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined,\n clear: req.body.clear === true,\n maxSelections: typeof req.body.maxSelections === 'number' ? req.body.maxSelections : undefined,\n mode: req.body.mode === 'add' || req.body.mode === 'remove' || req.body.mode === 'toggle' || req.body.mode === 'replace' ? req.body.mode : undefined,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/reviews/:assetId',\n asyncRoute((req, res) => {\n res.json(\n updateAssetReview(projectFrom(req), {\n assetId: req.params.assetId,\n reviewState: String(req.body.reviewState || 'unreviewed') as AssetReviewState,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/local-review/batch',\n asyncRoute((req, res) => {\n res.json(markAssetReviewsFromRequestBody(projectFrom(req), req.body as Record<string, unknown>));\n })\n);\n\napp.post(\n '/api/local-review/:assetId',\n asyncRoute((req, res) => {\n const rawState = String(req.body.reviewState || req.body.state || 'unreviewed');\n res.json(\n markAssetReview(projectFrom(req), {\n assetId: req.params.assetId,\n reviewState: rawState.replace(/-/g, '_') as AssetReviewState,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/assets/presign',\n asyncRoute((req, res) => {\n res.json(presignAsset(projectFrom(req), req.body.assetId, Number(req.body.expiresIn || 900)));\n })\n);\n\napp.post(\n '/api/assets/promote',\n asyncRoute((req, res) => {\n res.json(promoteAsset(projectFrom(req), req.body.assetId, Boolean(req.body.confirmWrite)));\n })\n);\n\napp.post(\n '/api/assets/pull',\n asyncRoute((req, res) => {\n res.json(pullAsset(projectFrom(req), req.body.assetId, typeof req.body.out === 'string' ? req.body.out : '.asset-scratch'));\n })\n);\n\napp.post(\n '/api/assets/archive',\n asyncRoute((req, res) => {\n res.json(archiveAsset(projectFrom(req), req.body.assetId, Boolean(req.body.confirmArchive)));\n })\n);\n\napp.post(\n '/api/assets/placement',\n asyncRoute((req, res) => {\n const body = req.body as Record<string, string | boolean>;\n const fields: PlacementFields = {\n assetId: String(body.assetId || ''),\n channel: String(body.channel || ''),\n status: String(body.status || 'planned') as PlacementStatus,\n scheduledAt: typeof body.scheduledAt === 'string' ? body.scheduledAt : undefined,\n postedAt: typeof body.postedAt === 'string' ? body.postedAt : undefined,\n url: typeof body.url === 'string' ? body.url : undefined,\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n confirmWrite: body.confirmWrite === true,\n };\n res.json(updatePlacement(projectFrom(req), fields));\n })\n);\n\napp.post(\n '/api/assets/delete-object',\n asyncRoute((req, res) => {\n res.json(deleteObjectGuarded(projectFrom(req), req.body.assetId, req.body.confirmation || ''));\n })\n);\n\napp.post(\n '/api/assets/upload',\n upload.single('file'),\n asyncRoute((req, res) => {\n const file = req.file?.path;\n try {\n if (!file) throw new Error('Upload requires a file');\n const body = req.body as Record<string, string>;\n const fields: UploadFields = {\n project: body.project || body.product || defaultProduct,\n campaign: body.campaign,\n channel: body.channel,\n audience: body.audience,\n status: body.status === 'published' ? 'published' : 'working',\n type: (body.type || 'image') as AssetContentType,\n assetId: body.assetId,\n title: body.title,\n hook: body.hook,\n cta: body.cta,\n utmContent: body.utmContent,\n messageFamily: body.messageFamily,\n format: body.format,\n notes: body.notes,\n confirmWrite: body.confirmWrite === 'true',\n };\n res.json(uploadAsset(file, fields));\n } finally {\n cleanupUploadedTemp(file);\n }\n })\n);\n\napp.post(\n '/api/assets/local-backup',\n asyncRoute((req, res) => {\n const body = req.body as Record<string, string | boolean>;\n const project = projectFrom(req);\n const path = typeof body.path === 'string' ? body.path : '';\n if (!path) throw new Error('Local backup requires path');\n const file = localPreviewPath(path);\n const fields: UploadFields = {\n project,\n assetId: String(body.assetId || ''),\n audience: String(body.audience || ''),\n campaign: String(body.campaign || ''),\n channel: String(body.channel || ''),\n cta: String(body.cta || ''),\n hook: String(body.hook || ''),\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n status: body.status === 'published' ? 'published' : 'working',\n title: String(body.title || ''),\n type: (body.type || 'image') as AssetContentType,\n utmContent: String(body.utmContent || ''),\n confirmWrite: body.confirmWrite === true,\n };\n if (body.dryRun === true) {\n res.json({ ok: true, message: `Ready to back up ${fields.assetId}`, output: { dryRun: true, path, fields } });\n return;\n }\n const approvedAsset = requireApprovedLocalBackupPath(project, path);\n res.json(uploadAsset(approvedAsset.local?.absolute_path || file, fields));\n })\n);\nif (isProduction) {\n const dist = join(repoRoot, 'dist', 'web');\n if (existsSync(dist)) {\n app.use(express.static(dist)); app.get('*', (_req, res) => res.sendFile(join(dist, 'index.html')));\n }\n} else {\n const { createServer: createViteServer } = await import('vite');\n const e2ePort = process.env.LINEAGE_E2E_PORT ? Number(process.env.LINEAGE_E2E_PORT) : undefined;\n const vite = await createViteServer({\n configFile: join(repoRoot, 'vite.config.ts'),\n server: {\n middlewareMode: true,\n ...(e2ePort ? { ws: { port: e2ePort + 1000 } } : {}),\n },\n appType: 'spa',\n });\n app.use(vite.middlewares);\n}\n\napp.use((error: unknown, _req: express.Request, res: express.Response, _next: express.NextFunction) => {\n if (error instanceof multer.MulterError && error.code === 'LIMIT_FILE_SIZE') {\n res.status(413).json({ error: `Upload exceeds ${Math.round(maxUploadBytes / 1024 / 1024)} MB` });\n return;\n }\n if (isLineageAssetError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isAssetLookupError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetReviewSetError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetReviewError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isContentBatchError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isPostingAdapterError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isAdapterSettingsError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetSelectionError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isGenerationReceiptError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAgentClaimError(error)) {\n res.status(error.status).json({ error: error.code, message: error.message, conflicts: error.conflicts });\n return;\n }\n if (isLineageWorkspaceError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isLineageError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ error: message });\n});\n\napp.listen(port, host, () => { console.log(`Lineage listening on http://${host}:${port}`); });\n", "import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { createS3StorageAdapter } from './adapters/storage';\nimport { listLocalReviewAssets, localPreviewPath as resolveLocalPreviewPath } from './localReview';\nimport { syncLedgerPlacement } from './assetLedgerWorkflow';\nimport { appName } from '../shared/appConstants';\nimport type {\n AssetCatalog,\n AssetContentType,\n AssetFacets,\n DoctorReport,\n AssetLibrarySnapshot,\n GrowthAsset,\n ListAssetsOptions,\n LiveS3Object,\n MutationResponse,\n PlacementFields,\n PlacementStatus,\n PresignResponse,\n ProjectSummary,\n UploadFields,\n} from '../shared/types';\n\nfunction isPackageRoot(path: string): boolean {\n const packageJson = join(path, 'package.json');\n if (!existsSync(packageJson)) return false;\n try {\n const packageInfo = JSON.parse(readFileSync(packageJson, 'utf8')) as { name?: string };\n return packageInfo.name === '@mean-weasel/lineage';\n } catch {\n return false;\n }\n}\n\nfunction resolveRepoRoot(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n process.env.LINEAGE_REPO_ROOT,\n resolve(moduleDir, '..'),\n resolve(moduleDir, '../..'),\n process.cwd(),\n ].filter((candidate): candidate is string => Boolean(candidate));\n const root = candidates.find(isPackageRoot);\n if (!root) throw new Error('Unable to locate Lineage package root');\n return root;\n}\n\nexport const repoRoot = resolveRepoRoot();\nexport const defaultProject = 'demo-project';\nexport const defaultProduct = process.env.LINEAGE_DEFAULT_PRODUCT || defaultProject;\nconst publicFallbackBucket = 'lineage-demo-assets';\nconst publicFallbackRegion = 'us-east-1';\nconst contentTypes = new Set<AssetContentType>(['image', 'video', 'gif', 'audio', 'doc', 'other']);\nconst baseChannels = ['linkedin', 'meta', 'tiktok', 'x-twitter', 'youtube'];\nconst placementStatuses = new Set<PlacementStatus>(['planned', 'scheduled', 'posted', 'skipped']);\nconst projectNamePattern = /^[a-z0-9][a-z0-9-]*$/;\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nclass LineageAssetError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageAssetError(error: unknown): error is LineageAssetError {\n return error instanceof LineageAssetError;\n}\n\nexport function cleanProject(project = defaultProject): string {\n if (!projectNamePattern.test(project)) {\n throw new LineageAssetError('Project must be lowercase kebab-case');\n }\n return project;\n}\n\nexport function catalogPath(project = defaultProject): string {\n return join(repoRoot, cleanProject(project), 'assets', 'catalog.json');\n}\n\nfunction fixtureCatalogPath(project = defaultProject): string {\n return join(repoRoot, 'fixtures', cleanProject(project), 'assets', 'catalog.json');\n}\n\nfunction resolvedCatalogPath(project = defaultProject): string {\n const path = catalogPath(project);\n if (existsSync(path)) return path;\n const clean = cleanProject(project);\n if (clean === defaultProject && existsSync(fixtureCatalogPath(clean))) return fixtureCatalogPath(clean);\n return path;\n}\n\nexport function normalizeCatalog(catalog: Partial<AssetCatalog>, fallbackProject = defaultProject): AssetCatalog {\n const project = cleanProject(catalog.project || catalog.product || fallbackProject);\n const product = catalog.product || project;\n return {\n ...catalog,\n project,\n product,\n default_bucket: catalog.default_bucket || '',\n default_region: catalog.default_region || '',\n assets: (catalog.assets || []).map(asset => ({\n ...asset,\n source: asset.source || 'catalog',\n project: asset.project || asset.product || project,\n product: asset.product || asset.project || project,\n })),\n };\n}\n\nfunction fallbackS3(assetId: string, channel: string, status = 'working') {\n return {\n bucket: publicFallbackBucket,\n checksum_sha256: undefined,\n content_type: 'image/png',\n key: `products/${defaultProject}/campaigns/2026-06-public-demo/channels/${channel}/audiences/creators/statuses/${status}/types/image/assets/${assetId}/${assetId}.png`,\n region: publicFallbackRegion,\n size_bytes: 2048,\n updated_at: '2026-06-24T12:00:00.000Z',\n version_id: 'public-demo-version',\n };\n}\n\nfunction fallbackAsset(fields: Omit<GrowthAsset, 'audience' | 'campaign' | 'content_type' | 'cta' | 'hook' | 'product' | 'project' | 'source' | 'utm_content'> & {\n audience?: string;\n campaign?: string;\n cta?: string;\n hook?: string;\n utm_content?: string;\n}): GrowthAsset {\n return {\n audience: fields.audience || 'creators',\n campaign: fields.campaign || '2026-06-public-demo',\n content_type: 'image',\n cta: fields.cta || 'Save the idea',\n hook: fields.hook || 'Public demo creative for local review.',\n product: defaultProject,\n project: defaultProject,\n source: 'catalog',\n utm_content: fields.utm_content || fields.asset_id.replace(/-/g, '_'),\n ...fields,\n };\n}\n\nfunction defaultFallbackCatalog(): AssetCatalog {\n return normalizeCatalog({\n assets: [\n fallbackAsset({\n asset_id: 'demo-meta-short-form-upload-demo-post-static',\n channel: 'meta',\n s3: fallbackS3('demo-meta-short-form-upload-demo-post-static', 'meta'),\n status: 'working',\n title: 'Meta short-form demo post static',\n }),\n fallbackAsset({\n asset_id: 'demo-linkedin-ledger-catalog-shared',\n channel: 'linkedin',\n hook: 'Shared ledger creative with catalog metadata.',\n s3: fallbackS3('demo-linkedin-ledger-catalog-shared', 'linkedin'),\n status: 'working',\n title: 'LinkedIn ledger catalog shared',\n }),\n fallbackAsset({\n asset_id: 'demo-linkedin-upload-demo-done-static-grounded-v2',\n channel: 'linkedin',\n placements: [{\n channel: 'linkedin',\n notes: 'Synthetic public scheduled placement.',\n scheduled_at: '2026-06-24T16:00:00-07:00',\n status: 'scheduled',\n updated_at: '2026-06-24T12:30:00.000Z',\n }],\n s3: fallbackS3('demo-linkedin-upload-demo-done-static-grounded-v2', 'linkedin', 'approved'),\n status: 'approved',\n title: 'LinkedIn upload demo scheduled static',\n }),\n fallbackAsset({\n asset_id: 'demo-tiktok-upload-demo-export-vertical',\n channel: 'tiktok',\n format: 'vertical',\n hook: 'Fast vertical demo export for content queue tests.',\n s3: fallbackS3('demo-tiktok-upload-demo-export-vertical', 'tiktok'),\n status: 'working',\n title: 'TikTok upload demo export vertical',\n }),\n fallbackAsset({\n asset_id: 'demo-youtube-short-demo-posted-cut',\n channel: 'youtube',\n placements: [{\n channel: 'youtube',\n notes: 'Synthetic public posted placement.',\n posted_at: '2026-06-25T16:00:00-07:00',\n status: 'posted',\n updated_at: '2026-06-25T17:00:00.000Z',\n }],\n s3: fallbackS3('demo-youtube-short-demo-posted-cut', 'youtube', 'published'),\n status: 'published',\n title: 'YouTube short demo posted cut',\n }),\n fallbackAsset({\n asset_id: 'demo-x-twitter-carousel-demo-working-static',\n channel: 'x-twitter',\n format: 'static',\n s3: fallbackS3('demo-x-twitter-carousel-demo-working-static', 'x-twitter'),\n status: 'working',\n title: 'X Twitter carousel demo working static',\n }),\n ],\n default_bucket: '',\n default_region: '',\n product: defaultProject,\n project: defaultProject,\n }, defaultProject);\n}\n\nfunction isDefaultFallbackCatalog(catalog: AssetCatalog): boolean {\n return catalog.project === defaultProject && !existsSync(catalogPath(defaultProject));\n}\n\nfunction fallbackPreviewDataUrl(asset: GrowthAsset): string {\n const label = `${asset.title}\\n${asset.channel} / ${asset.status}`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\"><rect width=\"1200\" height=\"675\" fill=\"#f7f5ef\"/><rect x=\"56\" y=\"56\" width=\"1088\" height=\"563\" rx=\"18\" fill=\"#10201c\"/><text x=\"96\" y=\"145\" fill=\"#9fe6c8\" font-family=\"Arial, sans-serif\" font-size=\"34\" font-weight=\"700\">Lineage public demo preview</text><text x=\"96\" y=\"230\" fill=\"#fff8e6\" font-family=\"Arial, sans-serif\" font-size=\"56\" font-weight=\"700\">${escapeSvgText(asset.asset_id)}</text><text x=\"96\" y=\"330\" fill=\"#d9e8df\" font-family=\"Arial, sans-serif\" font-size=\"34\">${escapeSvgText(label)}</text><text x=\"96\" y=\"500\" fill=\"#9fb7ae\" font-family=\"Arial, sans-serif\" font-size=\"26\">Synthetic local placeholder. No external storage requested.</text></svg>`;\n return `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`;\n}\n\nfunction escapeSvgText(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport function loadCatalog(project = defaultProject): AssetCatalog {\n const path = catalogPath(project);\n if (existsSync(path)) {\n try {\n return normalizeCatalog(JSON.parse(readFileSync(path, 'utf8')) as Partial<AssetCatalog>, project);\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n throw new LineageAssetError(`Missing catalog: ${path}`, 404);\n }\n throw error;\n }\n }\n const clean = cleanProject(project);\n if (clean === defaultProject) {\n const fixturePath = fixtureCatalogPath(clean);\n if (existsSync(fixturePath)) {\n return normalizeCatalog(JSON.parse(readFileSync(fixturePath, 'utf8')) as Partial<AssetCatalog>, project);\n }\n return defaultFallbackCatalog();\n }\n throw new LineageAssetError(`Missing catalog: ${path}`, 404);\n}\n\nfunction saveCatalog(project: string, catalog: AssetCatalog): AssetCatalog {\n const normalized = normalizeCatalog(catalog, project);\n mkdirSync(dirname(catalogPath(project)), { recursive: true });\n writeFileSync(catalogPath(project), `${JSON.stringify(normalized, null, 2)}\\n`);\n return normalized;\n}\n\nfunction run(command: string, args: string[]): CommandResult {\n const result = spawnSync(command, args, {\n cwd: repoRoot,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n AWS_REGION: process.env.AWS_REGION || 'us-east-1',\n AWS_DEFAULT_REGION: process.env.AWS_DEFAULT_REGION || 'us-east-1',\n },\n });\n\n if (result.status !== 0) {\n const detail = result.stderr.trim() || result.stdout.trim();\n throw new LineageAssetError(`${command} ${args.join(' ')} failed${detail ? `: ${detail}` : ''}`, 502);\n }\n\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction runAws(args: string[]): CommandResult {\n return run('aws', args);\n}\n\nexport function listProjects(): ProjectSummary[] {\n const projects = readdirSync(repoRoot, { withFileTypes: true })\n .filter(entry => entry.isDirectory() && projectNamePattern.test(entry.name) && existsSync(catalogPath(entry.name)))\n .flatMap(entry => {\n try {\n const catalog = loadCatalog(entry.name);\n return [{ project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(entry.name), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length }];\n } catch (error) {\n if (error instanceof LineageAssetError && error.status === 404) return [];\n throw error;\n }\n })\n .sort((a, b) => a.project.localeCompare(b.project));\n if (!projects.some(item => item.project === defaultProject)) {\n const catalog = loadCatalog(defaultProject);\n projects.push({ project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(defaultProject), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length });\n projects.sort((a, b) => a.project.localeCompare(b.project));\n }\n return projects;\n}\n\nfunction assetById(catalog: AssetCatalog, assetId: string): GrowthAsset {\n const asset = catalog.assets.find(item => item.asset_id === assetId);\n if (!asset) throw new LineageAssetError(`Unknown asset: ${assetId}`, 404);\n return asset;\n}\n\nconst storageAdapter = createS3StorageAdapter({\n assetById,\n cleanProject,\n createError: (message, status) => new LineageAssetError(message, status),\n defaultProject,\n loadCatalog,\n runAws,\n repoRoot,\n saveCatalog,\n supportedContentTypes: contentTypes,\n});\n\nfunction uniqueSorted<T extends string>(values: Array<T | undefined>): T[] {\n return Array.from(new Set(values.filter(Boolean) as T[])).sort();\n}\n\nfunction facetsFor(assets: GrowthAsset[]): AssetFacets {\n return {\n audiences: uniqueSorted(assets.map(asset => asset.audience)),\n campaigns: uniqueSorted(assets.map(asset => asset.campaign)),\n channels: uniqueSorted([...baseChannels, ...assets.map(asset => asset.channel)]),\n contentTypes: uniqueSorted(assets.map(asset => asset.content_type)),\n placementStatuses: uniqueSorted(assets.flatMap(asset => asset.placements?.map(placement => placement.status) || [])),\n statuses: uniqueSorted(assets.map(asset => asset.status)),\n totalSizeBytes: assets.reduce((sum, asset) => sum + (asset.s3?.size_bytes || 0), 0),\n };\n}\n\nfunction filteredAssets(assets: GrowthAsset[], options: ListAssetsOptions): GrowthAsset[] {\n const query = options.query?.trim().toLowerCase();\n return assets.filter(asset => {\n if (options.status && options.status !== 'all' && asset.status !== options.status) return false;\n if (options.channel && options.channel !== 'all' && asset.channel !== options.channel) return false;\n if (options.type && options.type !== 'all' && asset.content_type !== options.type) return false;\n if (options.placementStatus === 'not-posted' && asset.placements?.some(placement => placement.status === 'posted')) return false;\n if (options.placementStatus && !['all', 'not-posted'].includes(options.placementStatus) && !asset.placements?.some(placement => placement.status === options.placementStatus)) return false;\n if (options.campaign && options.campaign !== 'all' && asset.campaign !== options.campaign) return false;\n if (options.audience && options.audience !== 'all' && asset.audience !== options.audience) return false;\n if (!query) return true;\n return [asset.asset_id, asset.title, asset.campaign, asset.channel, asset.audience, asset.hook, asset.cta]\n .join(' ')\n .toLowerCase()\n .includes(query);\n });\n}\n\nexport function listAssets(project = defaultProject, options: ListAssetsOptions = {}): AssetLibrarySnapshot {\n const catalog = loadCatalog(project);\n const pageSize = Math.min(Math.max(Number(options.pageSize || 10), 1), 100);\n const page = Math.max(Number(options.page || 1), 1);\n const localAssets = listLocalReviewAssets(repoRoot, catalog.project, catalog);\n const source = options.source || 'catalog';\n const sourceAssets = source === 'local' ? localAssets : source === 'all' ? [...localAssets, ...catalog.assets] : catalog.assets;\n const filtered = filteredAssets(sourceAssets, options);\n const totalPages = Math.max(Math.ceil(filtered.length / pageSize), 1);\n const safePage = Math.min(page, totalPages);\n const start = (safePage - 1) * pageSize;\n const pageAssets = filtered.slice(start, start + pageSize);\n let liveObjects: LiveS3Object[] = [];\n let error: string | undefined;\n if (options.includeLive && !isDefaultFallbackCatalog(catalog)) {\n try {\n liveObjects = storageAdapter.listLiveObjects(catalog);\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n }\n }\n return {\n catalog: { project: catalog.project, product: catalog.product, default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length },\n assets: pageAssets,\n facets: facetsFor(catalog.assets),\n pagination: { page: safePage, pageSize, total: filtered.length, totalPages },\n liveObjects,\n orphanObjects: liveObjects.filter(object => !object.cataloged),\n identity: options.includeLive && !isDefaultFallbackCatalog(catalog) ? storageAdapter.getIdentity() : undefined,\n fetchedAt: new Date().toISOString(),\n error,\n };\n}\n\nexport function inspectAsset(project: string, assetId: string): GrowthAsset {\n return assetById(loadCatalog(project), assetId);\n}\n\nexport function validateProject(project = defaultProject): ProjectSummary {\n const catalog = loadCatalog(project);\n return { project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(project), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length };\n}\n\nexport function doctorProject(project = defaultProject, options: { includeLive?: boolean } = {}): DoctorReport {\n const summary = validateProject(project);\n let liveCheck: DoctorReport['liveCheck'] = 'skipped';\n let liveError: string | undefined;\n if (options.includeLive && isDefaultFallbackCatalog(loadCatalog(project))) {\n liveCheck = 'skipped';\n liveError = `${appName} public fallback uses local catalog data only.`;\n } else if (options.includeLive) {\n try {\n storageAdapter.listLiveObjects(loadCatalog(project));\n liveCheck = 'ok';\n } catch (error) {\n liveCheck = 'error';\n liveError = error instanceof Error ? error.message : String(error);\n }\n }\n return { catalogExists: true, deleteEnabled: process.env.LINEAGE_ENABLE_CLOUD_DELETE === 'true', project: summary, liveCheck, liveError };\n}\n\nexport function pullAsset(project: string, assetId: string, out = '.asset-scratch'): MutationResponse {\n return storageAdapter.pullAsset(project, assetId, out);\n}\n\nfunction placementFromFields(fields: PlacementFields) {\n if (!fields.channel) throw new LineageAssetError('Placement requires channel');\n if (!placementStatuses.has(fields.status)) throw new LineageAssetError(`Unsupported placement status: ${fields.status}`);\n const now = new Date().toISOString();\n return {\n channel: fields.channel,\n status: fields.status,\n ...(fields.scheduledAt ? { scheduled_at: fields.scheduledAt } : {}),\n ...(fields.postedAt ? { posted_at: fields.postedAt } : {}),\n ...(fields.url ? { url: fields.url } : {}),\n ...(fields.notes ? { notes: fields.notes } : {}),\n updated_at: now,\n };\n}\n\nexport function previewPlacement(project: string, fields: PlacementFields) {\n const asset = inspectAsset(project, fields.assetId);\n return { asset_id: asset.asset_id, placement: placementFromFields(fields) };\n}\n\nexport function updatePlacement(project: string, fields: PlacementFields): MutationResponse {\n if (!fields.confirmWrite) throw new LineageAssetError('Placement updates require confirmWrite=true');\n const catalog = loadCatalog(project);\n const asset = assetById(catalog, fields.assetId);\n const placement = placementFromFields(fields);\n const existing = asset.placements?.findIndex(item => item.channel === placement.channel);\n if (existing !== undefined && existing >= 0) asset.placements![existing] = placement;\n else asset.placements = [...(asset.placements || []), placement];\n saveCatalog(project, catalog);\n syncLedgerPlacement(project, asset.asset_id, placement);\n return { ok: true, message: `Marked ${asset.asset_id} ${placement.status} for ${placement.channel}`, catalog };\n}\n\nexport function presignAsset(project: string, assetId: string, expiresIn = 900): PresignResponse {\n const catalog = loadCatalog(project);\n if (isDefaultFallbackCatalog(catalog)) {\n const asset = assetById(catalog, assetId);\n return { assetId: asset.asset_id, expiresIn, url: fallbackPreviewDataUrl(asset) };\n }\n return storageAdapter.presignAsset(project, assetId, expiresIn);\n}\n\nexport function localPreviewPath(relativePath: string): string {\n try {\n return resolveLocalPreviewPath(repoRoot, relativePath);\n } catch (error) {\n throw new LineageAssetError(error instanceof Error ? error.message : 'Unknown local review asset', 404);\n }\n}\n\nexport function promoteAsset(project: string, assetId: string, confirmWrite: boolean): MutationResponse {\n return storageAdapter.promoteAsset(project, assetId, confirmWrite);\n}\n\nexport function archiveAsset(project: string, assetId: string, confirmArchive: boolean): MutationResponse {\n if (!confirmArchive) throw new LineageAssetError('Archive requires confirmArchive=true');\n const catalog = loadCatalog(project);\n const asset = assetById(catalog, assetId);\n asset.status = 'archived';\n saveCatalog(project, catalog);\n return { ok: true, message: `Archived ${assetId}`, catalog };\n}\n\nexport function uploadAsset(file: string, fields: UploadFields): MutationResponse {\n return storageAdapter.uploadAsset(file, fields);\n}\n\nexport function deleteObjectGuarded(project: string, assetId: string, confirmation: string): MutationResponse {\n return storageAdapter.deleteObjectGuarded(project, assetId, confirmation);\n}\n\nexport function ensureUploadDir(): string {\n const dir = join(repoRoot, '.asset-scratch', 'studio-uploads');\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nexport function cleanupUploadedTemp(file?: string): void {\n if (!file) return;\n const uploadRoot = ensureUploadDir();\n const resolved = resolve(file);\n if (resolved.startsWith(`${uploadRoot}/`) && existsSync(resolved)) {\n unlinkSync(resolved);\n }\n}\n", "import { copyFileSync, existsSync, mkdirSync, statSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\nimport { contentTypeFor, fileSha256 } from '../../localReview';\nimport type { AssetCatalog, LiveS3Object, MutationResponse, PresignResponse } from '../../../shared/types';\nimport type { StorageAdapter, StorageAdapterDependencies } from './types';\n\nexport function parseAssetIdFromS3Key(key: string): string | undefined {\n const marker = '/assets/';\n const index = key.indexOf(marker);\n if (index === -1) return undefined;\n return key.slice(index + marker.length).split('/')[0];\n}\n\nfunction previewDataUrl(asset: { asset_id: string; channel?: string; status?: string; title?: string }): string {\n const title = asset.title || asset.asset_id;\n const label = `${asset.channel || 'catalog'} / ${asset.status || 'working'}`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\"><rect width=\"1200\" height=\"675\" fill=\"#f7f5ef\"/><rect x=\"56\" y=\"56\" width=\"1088\" height=\"563\" rx=\"18\" fill=\"#10201c\"/><text x=\"96\" y=\"145\" fill=\"#9fe6c8\" font-family=\"Arial, sans-serif\" font-size=\"34\" font-weight=\"700\">Lineage catalog preview</text><text x=\"96\" y=\"230\" fill=\"#fff8e6\" font-family=\"Arial, sans-serif\" font-size=\"56\" font-weight=\"700\">${escapeSvgText(asset.asset_id)}</text><text x=\"96\" y=\"330\" fill=\"#d9e8df\" font-family=\"Arial, sans-serif\" font-size=\"34\">${escapeSvgText(title)}</text><text x=\"96\" y=\"500\" fill=\"#9fb7ae\" font-family=\"Arial, sans-serif\" font-size=\"26\">${escapeSvgText(label)}. No external storage requested.</text></svg>`;\n return `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`;\n}\n\nfunction escapeSvgText(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport function createS3StorageAdapter(deps: StorageAdapterDependencies): StorageAdapter {\n return {\n deleteObjectGuarded(project, assetId, confirmation): MutationResponse {\n const enabled = process.env.LINEAGE_ENABLE_CLOUD_DELETE === 'true';\n if (!enabled) {\n throw deps.createError('S3 delete is disabled. Use archive unless a human enables LINEAGE_ENABLE_CLOUD_DELETE.', 403);\n }\n if (confirmation !== `delete ${assetId}`) {\n throw deps.createError(`Delete confirmation must exactly equal: delete ${assetId}`);\n }\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n if (!asset.s3) throw deps.createError(`Asset has no S3 object: ${assetId}`);\n deps.runAws(['s3api', 'delete-object', '--bucket', asset.s3.bucket, '--key', asset.s3.key, '--region', asset.s3.region]);\n asset.status = 'archived';\n deps.saveCatalog(project, catalog);\n return { ok: true, message: `Deleted current S3 object and archived ${assetId}`, catalog };\n },\n\n getIdentity() {\n try {\n const output = deps.runAws(['sts', 'get-caller-identity', '--query', '{Account:Account,Arn:Arn}', '--output', 'json']);\n const parsed = JSON.parse(output.stdout) as { Account: string; Arn: string };\n return { account: parsed.Account, arn: parsed.Arn };\n } catch {\n return undefined;\n }\n },\n\n listLiveObjects(catalog: AssetCatalog): LiveS3Object[] {\n const bucket = catalog.default_bucket;\n const region = catalog.default_region;\n // Existing uploaded objects live under products/<project>; do not rewrite keys during project migration.\n const prefix = `products/${catalog.product}/`;\n const output = deps.runAws(['s3api', 'list-objects-v2', '--bucket', bucket, '--prefix', prefix, '--region', region, '--output', 'json']);\n const parsed = JSON.parse(output.stdout) as {\n Contents?: Array<{ Key: string; Size: number; LastModified: string; StorageClass?: string }>;\n };\n const catalogKeys = new Set(catalog.assets.map(asset => asset.s3?.key).filter(Boolean));\n return (parsed.Contents || []).map(item => ({\n key: item.Key,\n size: item.Size,\n lastModified: item.LastModified,\n storageClass: item.StorageClass,\n cataloged: catalogKeys.has(item.Key),\n assetId: parseAssetIdFromS3Key(item.Key),\n }));\n },\n\n presignAsset(project, assetId, expiresIn = 900): PresignResponse {\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n return { assetId, expiresIn, url: previewDataUrl(asset) };\n },\n\n promoteAsset(project, assetId, confirmWrite): MutationResponse {\n if (!confirmWrite) throw deps.createError('Promote requires confirmWrite=true');\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n asset.status = 'published';\n deps.saveCatalog(project, catalog);\n return {\n ok: true,\n message: `Promoted ${assetId}`,\n catalog,\n };\n },\n\n pullAsset(project, assetId, out = '.asset-scratch'): MutationResponse {\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n return {\n ok: true,\n message: `Prepared ${assetId} for local review`,\n output: {\n assetId: asset.asset_id,\n out,\n storage: asset.local ? 'local' : asset.s3 ? 'catalog-s3-metadata' : 'catalog',\n note: 'Lineage public package does not pull cloud objects automatically.',\n },\n };\n },\n\n uploadAsset(file, fields): MutationResponse {\n if (!fields.confirmWrite) throw deps.createError('Upload requires confirmWrite=true');\n if (!existsSync(file)) throw deps.createError(`Upload file missing: ${file}`, 404);\n if (!['working', 'published'].includes(fields.status)) throw deps.createError('Upload status must be working or published');\n if (!deps.supportedContentTypes.has(fields.type)) throw deps.createError(`Unsupported asset type: ${fields.type}`);\n\n const project = deps.cleanProject(fields.project || fields.product || deps.defaultProject);\n const catalog = deps.loadCatalog(project);\n const relativePath = join('uploads', project, fields.assetId, basename(file));\n const absolutePath = join(deps.repoRoot, '.asset-scratch', relativePath);\n mkdirSync(dirname(absolutePath), { recursive: true });\n copyFileSync(file, absolutePath);\n const stats = statSync(absolutePath);\n const contentType = contentTypeFor(absolutePath);\n const checksumSha256 = fileSha256(absolutePath);\n const now = new Date().toISOString();\n const nextAsset = {\n asset_id: fields.assetId,\n audience: fields.audience,\n campaign: fields.campaign,\n channel: fields.channel,\n content_type: fields.type,\n cta: fields.cta,\n hook: fields.hook,\n ...(fields.format ? { format: fields.format } : {}),\n local: {\n absolute_path: absolutePath,\n checksum_sha256: checksumSha256,\n content_type: contentType,\n relative_path: relativePath,\n size_bytes: stats.size,\n updated_at: now,\n },\n ...(fields.messageFamily ? { message_family: fields.messageFamily } : {}),\n ...(fields.notes ? { notes: fields.notes } : {}),\n product: project,\n project,\n source: 'catalog' as const,\n status: fields.status,\n title: fields.title,\n utm_content: fields.utmContent,\n };\n const existing = catalog.assets.findIndex(asset => asset.asset_id === fields.assetId);\n if (existing >= 0) catalog.assets[existing] = { ...catalog.assets[existing], ...nextAsset };\n else catalog.assets.push(nextAsset);\n deps.saveCatalog(project, catalog);\n return {\n ok: true,\n message: `Recorded ${fields.assetId} locally`,\n output: {\n file: basename(absolutePath),\n relativePath,\n sizeBytes: stats.size,\n contentType,\n checksumSha256,\n },\n catalog,\n };\n },\n };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { basename, extname, join, relative, resolve } from 'node:path';\nimport type { AssetCatalog, AssetContentType, GrowthAsset } from '../shared/types';\n\nconst mimeByExt: Record<string, string> = {\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.mov': 'video/quicktime',\n '.mp4': 'video/mp4',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n};\nconst localReviewExts = new Set(Object.keys(mimeByExt));\nconst channelFromName = /\\b(linkedin|meta|tiktok|youtube|x-twitter|x)\\b/i;\nconst campaignFromPath = /\\b(20\\d{2}-\\d{2}-[a-z0-9-]+)\\b/i;\n\nclass LocalReviewError extends Error {\n status = 400;\n}\n\nfunction localReviewRoot(repoRoot: string): string {\n return join(repoRoot, '.asset-scratch');\n}\n\nexport function contentTypeFor(file: string): string {\n return mimeByExt[extname(file).toLowerCase()] || 'application/octet-stream';\n}\n\nexport function fileSha256(file: string): string {\n return createHash('sha256').update(readFileSync(file)).digest('hex');\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const relativePath = relative(parent, child);\n return Boolean(relativePath) && !relativePath.startsWith('..') && !relativePath.startsWith('/');\n}\n\nfunction walkLocalReviewFiles(dir: string, files: string[] = []): string[] {\n if (!existsSync(dir)) return files;\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return files;\n throw error;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'studio-uploads' || entry.name === 'playwright-results' || entry.name === 'lineage-demo') continue;\n if (process.env.NODE_ENV !== 'test' && /^vitest-/.test(entry.name)) continue;\n const path = join(dir, entry.name);\n if (entry.isDirectory()) walkLocalReviewFiles(path, files);\n else if (entry.isFile() && localReviewExts.has(extname(entry.name).toLowerCase())) files.push(path);\n }\n return files;\n}\n\nfunction inferCampaign(relativePath: string): string {\n return campaignFromPath.exec(relativePath)?.[1] || 'local-review';\n}\n\nfunction inferChannel(relativePath: string): string {\n const match = channelFromName.exec(relativePath);\n if (!match) return 'local';\n return match[1].toLowerCase() === 'x' ? 'x-twitter' : match[1].toLowerCase();\n}\n\nfunction inferContentType(file: string): AssetContentType {\n const mime = contentTypeFor(file);\n if (mime.startsWith('image/gif')) return 'gif';\n if (mime.startsWith('image/')) return 'image';\n if (mime.startsWith('video/')) return 'video';\n return 'other';\n}\n\nexport function listLocalReviewAssets(repoRoot: string, project: string, catalog: AssetCatalog): GrowthAsset[] {\n const catalogChecksums = new Set(catalog.assets.map(asset => asset.s3?.checksum_sha256).filter(Boolean));\n const root = localReviewRoot(repoRoot);\n return walkLocalReviewFiles(root)\n .flatMap(file => {\n try {\n const stats = statSync(file);\n const checksum = fileSha256(file);\n const relativePath = relative(root, file);\n return [{ checksum, file, relativePath, stats }];\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n })\n .filter(item => !catalogChecksums.has(item.checksum))\n .map(item => {\n const fileSlug = basename(item.file, extname(item.file));\n const channel = inferChannel(item.relativePath);\n return {\n asset_id: `local-${item.checksum.slice(0, 12)}`,\n project,\n product: project,\n source: 'local',\n campaign: inferCampaign(item.relativePath),\n channel,\n audience: 'local-review',\n status: 'planned',\n content_type: inferContentType(item.file),\n title: fileSlug.replace(/[-_]+/g, ' '),\n hook: item.relativePath,\n cta: 'Review before upload',\n utm_content: fileSlug.replace(/[^a-zA-Z0-9]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase() || 'local_review',\n notes: 'Local pre-push asset. Review and refine before uploading to S3.',\n local: {\n relative_path: item.relativePath,\n absolute_path: item.file,\n size_bytes: item.stats.size,\n content_type: contentTypeFor(item.file),\n checksum_sha256: item.checksum,\n updated_at: item.stats.mtime.toISOString(),\n },\n };\n });\n}\n\nexport function localPreviewPath(repoRoot: string, relativePath: string): string {\n const root = localReviewRoot(repoRoot);\n const resolved = resolve(root, relativePath);\n if (!isPathInside(resolved, root) || !existsSync(resolved)) throw new LocalReviewError('Unknown local review asset');\n if (!localReviewExts.has(extname(resolved).toLowerCase())) throw new LocalReviewError('Local preview type is not supported');\n return resolved;\n}\n", "import { createRequire } from 'node:module';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { repoRoot } from './assetCore';\n\nconst require = createRequire(import.meta.url);\nexport type DatabaseSync = DatabaseSyncType;\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function lineageDbPath(): string {\n return process.env.LINEAGE_DB || join(repoRoot, '.lineage', 'asset-lineage.sqlite');\n}\n\nexport function lineageDb(): DatabaseSync {\n mkdirSync(join(lineageDbPath(), '..'), { recursive: true });\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const database = new DatabaseSync(lineageDbPath());\n database.exec('PRAGMA foreign_keys = ON'); database.exec('PRAGMA busy_timeout = 5000');\n database.exec(`\n create table if not exists projects (\n id text primary key,\n product text not null,\n catalog_path text,\n created_at text not null,\n updated_at text not null\n );\n create table if not exists assets (\n id text primary key,\n project_id text not null references projects(id),\n source text not null check (source in ('local', 'catalog')),\n local_path text,\n s3_key text,\n checksum_sha256 text,\n media_type text not null,\n title text not null,\n status text not null,\n channel text,\n campaign text,\n audience text,\n size_bytes integer,\n content_type text,\n created_at text not null,\n updated_at text not null,\n last_seen_at text not null\n );\n create index if not exists assets_project_source_seen on assets(project_id, source, last_seen_at);\n create index if not exists assets_project_checksum on assets(project_id, checksum_sha256);\n create index if not exists assets_project_channel_campaign on assets(project_id, channel, campaign);\n create table if not exists asset_edges (\n id text primary key,\n project_id text not null references projects(id),\n parent_asset_id text not null references assets(id),\n child_asset_id text not null references assets(id),\n relation_type text not null check (relation_type in ('derived_from')),\n created_at text not null,\n unique (project_id, parent_asset_id, child_asset_id, relation_type)\n );\n create index if not exists edges_parent on asset_edges(project_id, parent_asset_id);\n create index if not exists edges_child on asset_edges(project_id, child_asset_id);\n create table if not exists asset_attempts (\n id text primary key,\n project_id text not null references projects(id),\n node_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n attempt_index integer not null check (attempt_index > 0),\n source text not null check (source in ('initial', 'generated_child', 'reroll')),\n prompt text,\n generation_job_id text,\n file_path text,\n checksum_sha256 text,\n created_at text not null,\n promoted_at text,\n is_current integer not null check (is_current in (0, 1)),\n unique(project_id, node_asset_id, attempt_index),\n unique(project_id, node_asset_id, asset_id, source)\n );\n create unique index if not exists asset_attempts_one_current\n on asset_attempts(project_id, node_asset_id)\n where is_current = 1;\n create index if not exists asset_attempts_node_created\n on asset_attempts(project_id, node_asset_id, created_at);\n create table if not exists asset_reroll_requests (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n node_asset_id text not null references assets(id),\n status text not null check (status in ('pending', 'resolved', 'cancelled')),\n requested_by text not null check (requested_by in ('human', 'agent', 'system')),\n notes text,\n created_at text not null,\n resolved_at text\n );\n create unique index if not exists asset_reroll_requests_one_pending\n on asset_reroll_requests(project_id, root_asset_id, node_asset_id)\n where status = 'pending';\n create index if not exists asset_reroll_requests_root_status\n on asset_reroll_requests(project_id, root_asset_id, status, created_at);\n create table if not exists asset_reviews (\n asset_id text primary key references assets(id),\n review_state text not null check (review_state in ('unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored')),\n reviewed_at text,\n ignored_at text,\n notes text,\n updated_at text not null\n );\n create table if not exists asset_selections (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n notes text,\n selected_at text not null,\n unique(project_id, root_asset_id)\n );\n create table if not exists asset_layouts (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n x real not null,\n y real not null,\n updated_at text not null,\n unique(project_id, root_asset_id, asset_id)\n );\n create table if not exists lineage_workspaces (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n title text not null,\n status text not null check (status in ('active', 'paused', 'archived')),\n notes text,\n created_by text not null check (created_by in ('human', 'agent', 'system')),\n active_at text,\n created_at text not null,\n updated_at text not null,\n unique(project_id, root_asset_id)\n );\n create index if not exists lineage_workspaces_project_status on lineage_workspaces(project_id, status, updated_at);\n create index if not exists lineage_workspaces_project_active on lineage_workspaces(project_id, active_at);\n create table if not exists asset_ledger_records (\n id text primary key,\n project_id text not null references projects(id),\n canonical_asset_id text not null,\n checksum_sha256 text,\n media_type text not null,\n title text not null,\n status text not null,\n channel text,\n campaign text,\n audience text,\n created_at text not null,\n updated_at text not null,\n first_seen_at text not null default (datetime('now')),\n last_seen_at text not null\n );\n create index if not exists asset_ledger_records_project_seen on asset_ledger_records(project_id, last_seen_at);\n create index if not exists asset_ledger_records_project_checksum on asset_ledger_records(project_id, checksum_sha256);\n create table if not exists asset_ledger_sources (\n id text primary key,\n project_id text not null references projects(id),\n record_id text not null references asset_ledger_records(id) on delete cascade,\n source_type text not null check (source_type in ('local', 'catalog', 's3')),\n asset_id text,\n local_path text,\n s3_bucket text,\n s3_region text,\n s3_key text,\n s3_version_id text,\n etag text,\n size_bytes integer,\n content_type text,\n updated_at text,\n first_seen_at text not null default (datetime('now')),\n last_seen_at text not null\n );\n create index if not exists asset_ledger_sources_project_type on asset_ledger_sources(project_id, source_type);\n create index if not exists asset_ledger_sources_record on asset_ledger_sources(project_id, record_id);\n create index if not exists asset_ledger_sources_s3_key on asset_ledger_sources(project_id, s3_key);\n create table if not exists asset_ledger_placements (\n id text primary key,\n project_id text not null references projects(id),\n asset_id text not null,\n channel text not null,\n status text not null,\n scheduled_at text,\n posted_at text,\n url text,\n notes text,\n updated_at text not null,\n synced_at text not null,\n unique(project_id, asset_id, channel)\n );\n create index if not exists asset_ledger_placements_project_status on asset_ledger_placements(project_id, status);\n create index if not exists asset_ledger_placements_asset on asset_ledger_placements(project_id, asset_id);\n create table if not exists asset_ledger_index_runs (\n id text primary key,\n project_id text not null references projects(id),\n source_mode text not null check (source_mode in ('all', 'catalog', 'local')),\n include_live_s3 integer not null default 0,\n status text not null check (status in ('running', 'complete', 'failed')),\n started_at text not null,\n completed_at text,\n assets_indexed integer not null default 0,\n records_after integer not null default 0,\n catalog_sources_after integer not null default 0,\n local_sources_after integer not null default 0,\n s3_sources_after integer not null default 0,\n error text\n );\n create index if not exists asset_ledger_index_runs_project_started on asset_ledger_index_runs(project_id, started_at);\n create table if not exists content_batches (\n id text not null,\n project_id text not null references projects(id),\n title text not null,\n campaign text,\n channel text,\n status text not null check (status in ('active', 'archived')),\n notes text,\n created_at text not null,\n updated_at text not null,\n primary key(project_id, id)\n );\n create index if not exists content_batches_project_updated on content_batches(project_id, updated_at);\n create table if not exists content_posts (\n id text not null,\n project_id text not null references projects(id),\n batch_id text not null,\n channel text not null,\n title text not null,\n phase text not null check (phase in ('draft', 'review', 'scheduled', 'posted', 'skipped', 'archived')),\n campaign text,\n body text,\n cta text,\n scheduled_at text,\n posted_at text,\n url text,\n notes text,\n source_path text,\n created_at text not null,\n updated_at text not null,\n primary key(project_id, id),\n foreign key(project_id, batch_id) references content_batches(project_id, id) on delete cascade\n );\n create index if not exists content_posts_project_phase on content_posts(project_id, phase);\n create index if not exists content_posts_batch on content_posts(project_id, batch_id);\n create table if not exists content_post_assets (\n id text primary key,\n project_id text not null references projects(id),\n post_id text not null,\n asset_id text not null,\n role text not null,\n notes text,\n attached_at text not null,\n unique(project_id, post_id, asset_id, role),\n foreign key(project_id, post_id) references content_posts(project_id, id) on delete cascade\n );\n create index if not exists content_post_assets_post on content_post_assets(project_id, post_id);\n create index if not exists content_post_assets_asset on content_post_assets(project_id, asset_id);\n create table if not exists content_targets (\n project_id text primary key references projects(id),\n post_id text not null,\n notes text,\n selected_at text not null,\n updated_at text not null,\n foreign key(project_id, post_id) references content_posts(project_id, id) on delete cascade\n );\n create table if not exists selection_sets (\n id text primary key,\n project_id text not null references projects(id),\n kind text not null check (kind in ('current', 'review')),\n key text not null,\n label text not null,\n status text not null check (status in ('active', 'archived')),\n created_by text not null check (created_by in ('human', 'agent', 'system')),\n created_at text not null,\n updated_at text not null,\n unique(project_id, kind, key)\n );\n create index if not exists selection_sets_project_kind on selection_sets(project_id, kind, updated_at);\n create table if not exists selection_items (\n id text primary key,\n set_id text not null references selection_sets(id) on delete cascade,\n asset_id text not null,\n role text not null check (role in ('primary', 'candidate', 'next_base')),\n variation_label text,\n position integer not null default 0,\n selected_by text check (selected_by in ('human', 'agent', 'system')),\n selected_at text,\n deselected_at text,\n notes text,\n created_at text not null,\n updated_at text not null,\n unique(set_id, asset_id)\n );\n create index if not exists selection_items_set_position on selection_items(set_id, position);\n create unique index if not exists selection_items_set_label on selection_items(set_id, variation_label) where variation_label is not null;\n create table if not exists generation_jobs (\n id text primary key,\n project_id text not null references projects(id),\n provider text not null default 'codex-handoff',\n adapter_version text not null,\n source_mode text not null check (source_mode in ('lineage_selection', 'lineage_reroll')),\n root_asset_id text not null references assets(id),\n prompt text not null,\n expected_output_count integer not null check (expected_output_count > 0),\n status text not null check (status in ('planned', 'imported', 'failed', 'cancelled')),\n output_dir text,\n handoff_json text,\n created_at text not null,\n updated_at text not null,\n imported_at text\n );\n create index if not exists generation_jobs_project_created on generation_jobs(project_id, created_at);\n create table if not exists generation_job_inputs (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n project_id text not null references projects(id),\n asset_id text not null references assets(id),\n root_asset_id text not null references assets(id),\n role text not null check (role in ('lineage_next_base', 'reference', 'reroll_target')),\n position integer not null,\n selection_strategy text not null,\n selection_snapshot_json text not null,\n unique(job_id, asset_id, role)\n );\n create index if not exists generation_job_inputs_job on generation_job_inputs(job_id, position);\n create table if not exists generation_job_outputs (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n project_id text not null references projects(id),\n output_index integer not null,\n file_path text not null,\n checksum_sha256 text not null,\n size_bytes integer not null,\n content_type text not null,\n imported_asset_id text not null references assets(id),\n parent_asset_id text not null references assets(id),\n imported_at text not null,\n unique(job_id, output_index),\n unique(job_id, file_path)\n );\n create index if not exists generation_job_outputs_job on generation_job_outputs(job_id, output_index);\n create table if not exists generation_job_receipts (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n receipt_type text not null check (receipt_type in ('plan', 'import', 'error')),\n status text not null check (status in ('ok', 'error')),\n command text not null,\n payload_json text not null,\n created_at text not null\n );\n create index if not exists generation_job_receipts_job on generation_job_receipts(job_id, created_at);\n create table if not exists adapter_settings (project_id text not null references projects(id), adapter_type text not null check (adapter_type in ('cloud', 'scheduler', 'image_generator')), provider text not null, enabled integer not null check (enabled in (0, 1)), secret_ref text, safe_config_json text not null, created_at text not null, updated_at text not null, primary key(project_id, adapter_type, provider)); create index if not exists adapter_settings_project_type on adapter_settings(project_id, adapter_type);\n create table if not exists agent_claims (\n id text primary key,\n token_hash text not null,\n project_id text not null references projects(id),\n channel text,\n scope_type text not null check (scope_type in ('lineage_workspace', 'content_post', 'content_queue_lane', 'selection_set', 'project_channel')),\n target_id text not null,\n target_title text,\n agent_id text,\n agent_name text not null,\n agent_kind text not null,\n thread_id text,\n status text not null check (status in ('active', 'expired', 'released', 'revoked', 'transferred')),\n created_at text not null,\n heartbeat_at text not null,\n expires_at text not null,\n released_at text,\n revoked_at text,\n revoked_by text,\n override_reason text,\n metadata_json text\n );\n create unique index if not exists agent_claims_token_hash on agent_claims(token_hash);\n create index if not exists agent_claims_project_status on agent_claims(project_id, status, heartbeat_at);\n create index if not exists agent_claims_target on agent_claims(project_id, channel, scope_type, target_id, status);\n create table if not exists agent_claim_events (\n id text primary key,\n claim_id text not null references agent_claims(id) on delete cascade,\n event_type text not null,\n actor text,\n message text,\n created_at text not null,\n metadata_json text\n );\n create index if not exists agent_claim_events_claim_created on agent_claim_events(claim_id, created_at);\n `);\n migrateAssetSelections(database);\n dropLegacyAssetSelectionRootUnique(database);\n ensureColumn(database, 'asset_selections', 'notes', 'text');\n ensureColumn(database, 'asset_ledger_records', 'first_seen_at', 'text');\n ensureColumn(database, 'asset_ledger_records', 'indexed_by_run_id', 'text');\n ensureColumn(database, 'asset_ledger_sources', 'first_seen_at', 'text');\n ensureColumn(database, 'asset_ledger_sources', 'indexed_by_run_id', 'text');\n ensureReviewStateValues(database);\n return database;\n}\n\nfunction ensureColumn(database: DatabaseSync, table: string, column: string, definition: string): void {\n const rows = database.prepare(`pragma table_info(${table})`).all() as Array<{ name: string }>;\n if (!rows.some(row => row.name === column)) database.exec(`alter table ${table} add column ${column} ${definition}`);\n}\n\nfunction migrateAssetSelections(database: DatabaseSync): void {\n const rows = database.prepare('pragma table_info(asset_selections)').all() as Array<{ name: string }>;\n if (rows.some(row => row.name === 'position')) return;\n const notesSelect = rows.some(row => row.name === 'notes') ? 'notes' : 'null';\n\n database.exec(`\n create table if not exists asset_selections_v2 (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n position integer not null default 0,\n notes text,\n selected_at text not null,\n unique(project_id, root_asset_id, asset_id)\n );\n insert or ignore into asset_selections_v2 (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n select\n project_id || ':' || root_asset_id || ':selected:' || asset_id,\n project_id,\n root_asset_id,\n asset_id,\n 0,\n ${notesSelect},\n selected_at\n from asset_selections;\n drop table asset_selections;\n alter table asset_selections_v2 rename to asset_selections;\n create index if not exists asset_selections_project_root_position\n on asset_selections(project_id, root_asset_id, position, selected_at);\n `);\n}\n\nfunction dropLegacyAssetSelectionRootUnique(database: DatabaseSync): void {\n const indexes = database.prepare('pragma index_list(asset_selections)').all() as Array<{ name: string; unique: number }>;\n for (const index of indexes) {\n if (!index.unique) continue;\n const columns = database.prepare(`pragma index_info(${index.name})`).all() as Array<{ name: string }>;\n const columnNames = columns.map(column => column.name).join(',');\n if (columnNames === 'project_id,root_asset_id') database.exec(`drop index if exists ${index.name}`);\n }\n}\n\nfunction ensureReviewStateValues(database: DatabaseSync): void {\n const createSql = database.prepare(\"select sql from sqlite_master where type = 'table' and name = 'asset_reviews'\").get() as { sql?: string } | undefined;\n if (createSql?.sql?.includes('needs_revision')) return;\n\n database.exec(`\n alter table asset_reviews rename to asset_reviews_old;\n create table asset_reviews (\n asset_id text primary key references assets(id),\n review_state text not null check (review_state in ('unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored')),\n reviewed_at text,\n ignored_at text,\n notes text,\n updated_at text not null\n );\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews_old;\n drop table asset_reviews_old;\n `);\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type {\n AssetLedgerRecord,\n AssetLedgerSelectionState,\n AssetLedgerSource,\n AssetLedgerWorkflowState,\n AssetPlacementState,\n AssetReviewLedgerState,\n GrowthAsset,\n PlacementStatus,\n} from '../shared/types';\n\ninterface ReviewRow {\n asset_id: string;\n review_state: AssetReviewLedgerState['review_state'];\n reviewed_at: string | null;\n ignored_at: string | null;\n notes: string | null;\n updated_at: string;\n}\n\ninterface PlacementRow {\n asset_id: string;\n channel: string;\n status: PlacementStatus;\n scheduled_at: string | null;\n posted_at: string | null;\n url: string | null;\n notes: string | null;\n updated_at: string;\n synced_at: string;\n}\n\ninterface SelectionRow {\n root_asset_id: string;\n asset_id: string;\n notes: string | null;\n selected_at: string;\n}\n\ntype PlacementInput = Omit<AssetPlacementState, 'asset_id' | 'synced_at'>;\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction upsertLedgerPlacement(database: DatabaseSync, project: string, assetId: string, placement: PlacementInput): void {\n const syncedAt = nowIso();\n database.prepare(`\n insert into asset_ledger_placements (\n id, project_id, asset_id, channel, status, scheduled_at, posted_at, url, notes, updated_at, synced_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, asset_id, channel) do update set\n status = excluded.status,\n scheduled_at = excluded.scheduled_at,\n posted_at = excluded.posted_at,\n url = excluded.url,\n notes = excluded.notes,\n updated_at = excluded.updated_at,\n synced_at = excluded.synced_at\n `).run(\n `${project}:${assetId}:placement:${placement.channel}`,\n project,\n assetId,\n placement.channel,\n placement.status,\n placement.scheduled_at || null,\n placement.posted_at || null,\n placement.url || null,\n placement.notes || null,\n placement.updated_at,\n syncedAt\n );\n}\n\nexport function upsertLedgerPlacementsForAsset(database: DatabaseSync, project: string, asset: GrowthAsset): void {\n for (const placement of asset.placements || []) upsertLedgerPlacement(database, project, asset.asset_id, placement);\n}\n\nexport function upsertLedgerWorkflowAsset(database: DatabaseSync, project: string, asset: GrowthAsset, timestamp: string): void {\n const source = asset.source === 'local' ? 'local' : 'catalog';\n database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n source = excluded.source, local_path = excluded.local_path, s3_key = excluded.s3_key,\n checksum_sha256 = excluded.checksum_sha256, media_type = excluded.media_type,\n title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `).run(\n asset.asset_id, project, source, asset.local?.relative_path || null, asset.s3?.key || null,\n asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null, asset.content_type, asset.title,\n asset.status, asset.channel || null, asset.campaign || null, asset.audience || null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null, asset.local?.content_type || asset.s3?.content_type || null,\n timestamp, timestamp, timestamp\n );\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `).run(asset.asset_id, timestamp);\n}\n\nexport function syncLedgerPlacement(project: string, assetId: string, placement: PlacementInput): void {\n const database = lineageDb();\n try {\n ensureProject(database, project);\n upsertLedgerPlacement(database, project, assetId, placement);\n } finally {\n database.close();\n }\n}\n\nfunction placeholders(values: string[]): string {\n return values.map(() => '?').join(',');\n}\n\nfunction assetIdsForRecord(record: AssetLedgerRecord, sources: AssetLedgerSource[]): string[] {\n return [...new Set([record.canonical_asset_id, ...sources.map(source => source.asset_id).filter(Boolean) as string[]])];\n}\n\nfunction reviewFromRow(row: ReviewRow): AssetReviewLedgerState {\n return {\n asset_id: row.asset_id,\n review_state: row.review_state,\n reviewed_at: row.reviewed_at || undefined,\n ignored_at: row.ignored_at || undefined,\n notes: row.notes || undefined,\n updated_at: row.updated_at,\n };\n}\n\nfunction placementFromRow(row: PlacementRow): AssetPlacementState {\n return {\n asset_id: row.asset_id,\n channel: row.channel,\n status: row.status,\n scheduled_at: row.scheduled_at || undefined,\n posted_at: row.posted_at || undefined,\n url: row.url || undefined,\n notes: row.notes || undefined,\n updated_at: row.updated_at,\n synced_at: row.synced_at,\n };\n}\n\nfunction selectionFromRow(row: SelectionRow): AssetLedgerSelectionState {\n return {\n root_asset_id: row.root_asset_id,\n asset_id: row.asset_id,\n notes: row.notes || undefined,\n selected_at: row.selected_at,\n };\n}\n\nexport function ledgerWorkflowStates(\n database: DatabaseSync,\n project: string,\n records: AssetLedgerRecord[],\n sources: AssetLedgerSource[]\n): Record<string, AssetLedgerWorkflowState> {\n const recordAssets = new Map(records.map(record => [record.id, assetIdsForRecord(record, sources.filter(source => source.record_id === record.id))]));\n const assetIds = [...new Set([...recordAssets.values()].flat())];\n if (assetIds.length === 0) return {};\n const marker = placeholders(assetIds);\n const reviews = database.prepare(`\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews\n where asset_id in (${marker})\n `).all(...assetIds) as unknown as ReviewRow[];\n const placements = database.prepare(`\n select asset_id, channel, status, scheduled_at, posted_at, url, notes, updated_at, synced_at\n from asset_ledger_placements\n where project_id = ? and asset_id in (${marker})\n `).all(project, ...assetIds) as unknown as PlacementRow[];\n const selections = database.prepare(`\n select root_asset_id, asset_id, notes, selected_at\n from asset_selections\n where project_id = ? and asset_id in (${marker})\n `).all(project, ...assetIds) as unknown as SelectionRow[];\n return Object.fromEntries(records.map(record => {\n const ids = recordAssets.get(record.id) || [];\n const review = reviews.find(row => ids.includes(row.asset_id));\n const selection = selections.find(row => ids.includes(row.asset_id));\n return [record.id, {\n review: review ? reviewFromRow(review) : undefined,\n placements: placements.filter(row => ids.includes(row.asset_id)).map(placementFromRow),\n selection: selection ? selectionFromRow(selection) : undefined,\n }];\n }));\n}\n", "import { cleanProject, loadCatalog, repoRoot } from './assetCore';\nimport { listLocalReviewAssets } from './localReview';\nimport type { AssetLookupSnapshot, GrowthAsset } from '../shared/types';\n\nclass AssetLookupError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetLookupError(error: unknown): error is AssetLookupError {\n return error instanceof AssetLookupError;\n}\n\nexport function lookupAssets(project: string, assetIds: string[]): AssetLookupSnapshot {\n const ids = [...new Set(assetIds.map(assetId => assetId.trim()).filter(Boolean))];\n if (ids.length > 50) throw new AssetLookupError('Asset lookup is limited to 50 asset IDs');\n const catalog = loadCatalog(cleanProject(project));\n const localAssets = listLocalReviewAssets(repoRoot, catalog.project, catalog);\n const byId = new Map<string, GrowthAsset>();\n for (const asset of [...catalog.assets, ...localAssets]) {\n if (ids.includes(asset.asset_id) && !byId.has(asset.asset_id)) byId.set(asset.asset_id, asset);\n }\n return {\n project: catalog.project,\n assets: ids.flatMap(assetId => byId.get(assetId) || []),\n missing: ids.filter(assetId => !byId.has(assetId)),\n fetchedAt: new Date().toISOString(),\n };\n}\n", "import { join } from 'node:path';\nimport { defaultProject, listAssets, repoRoot } from './assetCore';\nimport { lineageDb as db, lineageDbPath, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { LINEAGE_NEXT_VARIATION_LIMIT, normalizeSelectionInput, selectedRows, selectionId } from './assetLineageSelection';\nimport { activeLineageWorkspaceRoot } from './assetLineageWorkspaces';\nimport { requireLineageWorkspaceClaimForWrite } from './lineageClaimGuards';\nimport type {\n AssetReviewState,\n GrowthAsset,\n LineageAttempt,\n LineageAttemptPromotionResponse,\n LineageAttemptsResponse,\n LineageEdge,\n LineageChildrenResponse,\n LineageIndexSummary,\n LineageLayoutFields,\n LineageLinkFields,\n LineageNode,\n LineageNextResponse,\n LineagePosition,\n LineageRerollRequest,\n LineageRerollRequestMutationResponse,\n LineageRerollRequestsResponse,\n LineageSnapshot,\n ReviewFields,\n SelectionFields,\n} from '../shared/types';\n\nexport class LineageError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageError(error: unknown): error is LineageError {\n return error instanceof LineageError;\n}\n\nfunction collectAssets(project: string, source: 'catalog' | 'local'): GrowthAsset[] {\n const first = listAssets(project, { source, page: 1, pageSize: 100 });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { source, page, pageSize: 100 }).assets);\n }\n return assets;\n}\n\nfunction upsertProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n}\n\nfunction upsertAsset(database: DatabaseSync, project: string, asset: GrowthAsset): void {\n const timestamp = nowIso();\n const source = asset.source === 'local' ? 'local' : 'catalog';\n database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n source = excluded.source, local_path = excluded.local_path, s3_key = excluded.s3_key,\n checksum_sha256 = excluded.checksum_sha256, media_type = excluded.media_type,\n title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `).run(\n asset.asset_id, project, source, asset.local?.relative_path || null, asset.s3?.key || null,\n asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null, asset.content_type, asset.title,\n asset.status, asset.channel || null, asset.campaign || null, asset.audience || null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null, asset.local?.content_type || asset.s3?.content_type || null,\n timestamp, timestamp, timestamp\n );\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `).run(asset.asset_id, timestamp);\n}\n\nexport function indexLineageAssets(project = defaultProject): LineageIndexSummary {\n const database = db();\n const catalog = collectAssets(project, 'catalog');\n const local = collectAssets(project, 'local');\n upsertProject(database, project);\n for (const asset of [...catalog, ...local]) upsertAsset(database, project, asset);\n database.close();\n return { catalog: catalog.length, local: local.length, total: catalog.length + local.length, database: lineageDbPath() };\n}\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): void {\n const row = database.prepare('select id from assets where project_id = ? and id = ?').get(project, assetId);\n if (!row) throw new LineageError(`Unknown indexed asset: ${assetId}`, 404);\n}\n\nfunction parentOf(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select parent_asset_id from asset_edges where project_id = ? and child_asset_id = ? order by created_at limit 1').get(project, assetId) as { parent_asset_id?: string } | undefined;\n return row?.parent_asset_id;\n}\n\nfunction rootFor(database: DatabaseSync, project: string, assetId: string): string {\n let root = assetId;\n const seen = new Set<string>();\n while (!seen.has(root)) {\n seen.add(root);\n const parent = parentOf(database, project, root);\n if (!parent) return root;\n root = parent;\n }\n return assetId;\n}\n\nfunction assertCanonicalRoot(database: DatabaseSync, project: string, root: string): void {\n requireAsset(database, project, root);\n const canonicalRoot = rootFor(database, project, root);\n if (canonicalRoot !== root) throw new LineageError(`Asset ${root} is not a lineage root`, 400);\n}\n\nfunction explicitWorkspaceRoot(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare(`\n select root_asset_id from lineage_workspaces\n where project_id = ? and root_asset_id = ? and status != 'archived'\n `).get(project, assetId) as { root_asset_id?: string } | undefined;\n return row?.root_asset_id;\n}\n\nfunction nearestWorkspaceRoot(database: DatabaseSync, project: string, assetId: string): string {\n let current = assetId;\n const seen = new Set<string>();\n while (!seen.has(current)) {\n seen.add(current);\n const explicit = explicitWorkspaceRoot(database, project, current);\n if (explicit) return explicit;\n const parent = parentOf(database, project, current);\n if (!parent) return current;\n current = parent;\n }\n return assetId;\n}\n\nfunction assetChannel(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select channel from assets where project_id = ? and id = ?').get(project, assetId) as { channel?: string } | undefined;\n return row?.channel;\n}\n\nfunction lineageWriteClaimContext(database: DatabaseSync, project: string, assetId: string): { channel?: string; rootAssetId: string } {\n return {\n channel: assetChannel(database, project, assetId),\n rootAssetId: nearestWorkspaceRoot(database, project, assetId),\n };\n}\n\nexport function getLineageWriteClaimContext(project: string, assetId: string): { channel?: string; rootAssetId: string } {\n const database = db();\n try {\n requireAsset(database, project, assetId);\n return lineageWriteClaimContext(database, project, assetId);\n } finally {\n database.close();\n }\n}\n\nfunction latestSelectedRoot(database: DatabaseSync, project: string): string | undefined {\n const row = database.prepare('select root_asset_id from asset_selections where project_id = ? order by selected_at desc limit 1').get(project) as { root_asset_id?: string } | undefined;\n return row?.root_asset_id;\n}\n\nfunction resolveRoot(database: DatabaseSync, project: string, rootAssetId?: string): string {\n if (rootAssetId) {\n requireAsset(database, project, rootAssetId);\n return rootAssetId;\n }\n const root = activeLineageWorkspaceRoot(project) || latestSelectedRoot(database, project);\n if (!root) throw new LineageError('Lineage command requires --root unless a project selection exists');\n requireAsset(database, project, root);\n return root;\n}\n\nfunction edgeId(project: string, parent: string, child: string): string {\n return `${project}:${parent}:derived_from:${child}`;\n}\n\nfunction rerollRequestId(project: string, root: string, node: string, timestamp: string): string {\n return `${project}:${root}:reroll:${node}:${Date.parse(timestamp) || Date.now()}`;\n}\n\nfunction rowString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction rerollRequestFrom(row: Record<string, unknown>): LineageRerollRequest {\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n root_asset_id: String(row.root_asset_id),\n node_asset_id: String(row.node_asset_id),\n status: row.status as LineageRerollRequest['status'],\n requested_by: row.requested_by as LineageRerollRequest['requested_by'],\n notes: rowString(row.notes),\n created_at: String(row.created_at),\n resolved_at: rowString(row.resolved_at),\n };\n}\n\nfunction attemptFrom(row: Record<string, unknown>): LineageAttempt {\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n node_asset_id: String(row.node_asset_id),\n asset_id: String(row.asset_id),\n attempt_index: Number(row.attempt_index),\n source: row.source as LineageAttempt['source'],\n prompt: rowString(row.prompt),\n generation_job_id: rowString(row.generation_job_id),\n file_path: rowString(row.file_path),\n checksum_sha256: rowString(row.checksum_sha256),\n created_at: String(row.created_at),\n promoted_at: rowString(row.promoted_at),\n is_current: Boolean(Number(row.is_current)),\n };\n}\n\nfunction implicitAttempt(row: { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string }, isCurrent = true): LineageAttempt {\n const createdAt = row.asset_created_at || nowIso();\n return {\n id: `${row.project}:${row.asset_id}:attempt:implicit`,\n project_id: row.project,\n node_asset_id: row.asset_id,\n asset_id: row.asset_id,\n attempt_index: 1,\n source: 'initial',\n file_path: row.local_path,\n checksum_sha256: row.checksum_sha256,\n created_at: createdAt,\n promoted_at: createdAt,\n is_current: isCurrent,\n };\n}\n\nfunction withImplicitAttempt(physicalAttempts: LineageAttempt[], row: { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string }): LineageAttempt[] {\n if (physicalAttempts.some(attempt => attempt.source === 'initial')) return physicalAttempts;\n return [...physicalAttempts, implicitAttempt(row, !physicalAttempts.some(attempt => attempt.is_current))];\n}\n\nfunction assertNodeInRoot(database: DatabaseSync, project: string, root: string, node: string): void {\n assertCanonicalRoot(database, project, root);\n requireAsset(database, project, node);\n const nodeRoot = rootFor(database, project, node);\n if (nodeRoot !== root) throw new LineageError(`Asset ${node} is not in lineage rooted at ${root}`);\n}\n\nfunction assertAttemptAssetNotVisibleLineageNode(database: DatabaseSync, project: string, root: string, assetId: string): void {\n const visibleNodeIds = new Set([\n root,\n ...descendants(database, project, root).flatMap(edge => [edge.parent_asset_id, edge.child_asset_id]),\n ]);\n if (visibleNodeIds.has(assetId)) throw new LineageError(`Attempt asset ${assetId} is already a visible lineage node in ${root}`, 400);\n}\n\nfunction canPreviewLocally(mediaType: string, localPath?: string): boolean {\n return Boolean(localPath && ['image', 'video', 'gif'].includes(mediaType));\n}\n\nfunction localPreviewUrl(project: string, localPath?: string): string | undefined {\n if (!localPath) return undefined;\n const params = new URLSearchParams({ project, path: localPath });\n return `/api/assets/local-preview?${params.toString()}`;\n}\n\nexport function linkLineageAssets(project: string, fields: LineageLinkFields) {\n const database = db();\n requireAsset(database, project, fields.parentAssetId);\n requireAsset(database, project, fields.childAssetId);\n if (fields.parentAssetId === fields.childAssetId) throw new LineageError('Lineage link cannot point to itself');\n const claimContext = lineageWriteClaimContext(database, project, fields.parentAssetId);\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: claimContext.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: claimContext.rootAssetId,\n writeKind: 'lineage_link',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n const edge = {\n id: edgeId(project, fields.parentAssetId, fields.childAssetId), parent_asset_id: fields.parentAssetId,\n child_asset_id: fields.childAssetId, relation_type: 'derived_from' as const, created_at: nowIso(),\n };\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, edge };\n }\n database.prepare(`\n insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?)\n on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing\n `).run(edge.id, project, edge.parent_asset_id, edge.child_asset_id, edge.created_at);\n database.close();\n return { ok: true as const, message: `Linked ${edge.child_asset_id} from ${edge.parent_asset_id}`, edge };\n}\n\nfunction descendants(database: DatabaseSync, project: string, root: string): LineageEdge[] {\n const edges: LineageEdge[] = [];\n const queue = [root];\n const seen = new Set<string>();\n while (queue.length > 0) {\n const parent = queue.shift()!;\n if (seen.has(parent)) continue;\n seen.add(parent);\n const rows = database.prepare('select id, parent_asset_id, child_asset_id, relation_type, created_at from asset_edges where project_id = ? and parent_asset_id = ? order by created_at').all(project, parent) as unknown as LineageEdge[];\n edges.push(...rows);\n queue.push(...rows.map(row => row.child_asset_id));\n }\n return edges;\n}\n\nexport function getLineageSnapshot(project: string, assetId: string): LineageSnapshot {\n const database = db();\n requireAsset(database, project, assetId);\n const root = explicitWorkspaceRoot(database, project, assetId) || rootFor(database, project, assetId);\n const edges = descendants(database, project, root);\n const ids = [...new Set([root, ...edges.flatMap(edge => [edge.parent_asset_id, edge.child_asset_id])])];\n const placeholders = ids.map(() => '?').join(',');\n const rows = database.prepare(`\n select a.id asset_id, a.project_id project, a.source, a.title, a.media_type, a.status, a.channel, a.campaign,\n a.local_path, a.s3_key, a.checksum_sha256, coalesce(r.review_state, 'unreviewed') review_state,\n r.notes review_notes, a.created_at asset_created_at, l.x layout_x, l.y layout_y\n from assets a left join asset_reviews r on r.asset_id = a.id\n left join asset_layouts l on l.project_id = a.project_id and l.root_asset_id = ? and l.asset_id = a.id\n where a.project_id = ? and a.id in (${placeholders})\n `).all(root, project, ...ids) as Array<Omit<LineageNode, 'attempt_count' | 'current_attempt' | 'is_latest' | 'position' | 'preview_url' | 'reroll_request' | 'selection_note' | 'user_selected'> & { asset_created_at?: string; layout_x?: number; layout_y?: number }>;\n const attemptRows = ids.length > 0\n ? database.prepare(`select * from asset_attempts where project_id = ? and node_asset_id in (${placeholders}) order by node_asset_id, attempt_index desc`).all(project, ...ids) as Array<Record<string, unknown>>\n : [];\n const attemptsByNode = new Map<string, LineageAttempt[]>();\n for (const attempt of attemptRows.map(attemptFrom)) {\n attemptsByNode.set(attempt.node_asset_id, [...(attemptsByNode.get(attempt.node_asset_id) || []), attempt]);\n }\n const rerollRows = ids.length > 0\n ? database.prepare(`select * from asset_reroll_requests where project_id = ? and root_asset_id = ? and status = 'pending' and node_asset_id in (${placeholders}) order by created_at`).all(project, root, ...ids) as Array<Record<string, unknown>>\n : [];\n const rerollsByNode = new Map(rerollRows.map(row => {\n const request = rerollRequestFrom(row);\n return [request.node_asset_id, request] as const;\n }));\n const selected = selectedRows(database, project, root);\n const childIds = new Set(edges.map(edge => edge.parent_asset_id));\n const selectedIds = new Set(selected.map(row => row.asset_id));\n const selections = selected.map(row => ({\n asset_id: row.asset_id, notes: row.notes || undefined,\n position: Number(row.position || 0), selected_at: row.selected_at,\n }));\n const selection = selections[0] || null;\n const nodes = rows.map(row => {\n const position: LineagePosition | undefined = typeof row.layout_x === 'number' && typeof row.layout_y === 'number' ? { x: row.layout_x, y: row.layout_y } : undefined;\n const { asset_created_at: _assetCreatedAt, layout_x: _layoutX, layout_y: _layoutY, ...node } = row;\n const nodeSelection = selections.find(item => item.asset_id === row.asset_id);\n const attempts = withImplicitAttempt(attemptsByNode.get(row.asset_id) || [], row);\n const currentAttempt = attempts.find(attempt => attempt.is_current) || attempts[0];\n const previewPath = currentAttempt?.file_path || row.local_path;\n return {\n ...node,\n attempt_count: attempts.length,\n current_attempt: currentAttempt,\n is_latest: !childIds.has(row.asset_id),\n position,\n preview_url: canPreviewLocally(row.media_type, previewPath) ? localPreviewUrl(project, previewPath) : undefined,\n reroll_request: rerollsByNode.get(row.asset_id),\n selection_note: nodeSelection?.notes,\n user_selected: selectedIds.has(row.asset_id),\n };\n });\n database.close();\n return {\n project,\n root_asset_id: root,\n active_asset_id: assetId,\n selected: selections.map(row => row.asset_id),\n selection,\n selections,\n latest: nodes.filter(node => node.is_latest).map(node => node.asset_id),\n nodes,\n edges,\n fetchedAt: nowIso(),\n };\n}\n\nexport function updateLineageLayout(project: string, fields: LineageLayoutFields) {\n if (fields.positions.length === 0) throw new LineageError('Lineage layout requires at least one position');\n const database = db();\n requireAsset(database, project, fields.rootAssetId);\n for (const position of fields.positions) requireAsset(database, project, position.assetId);\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: assetChannel(database, project, fields.rootAssetId),\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: fields.rootAssetId,\n writeKind: 'lineage_layout',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, root_asset_id: fields.rootAssetId, positions: fields.positions };\n }\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into asset_layouts (id, project_id, root_asset_id, asset_id, x, y, updated_at)\n values (?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, root_asset_id, asset_id) do update set\n x = excluded.x, y = excluded.y, updated_at = excluded.updated_at\n `);\n for (const position of fields.positions) {\n statement.run(`${project}:${fields.rootAssetId}:layout:${position.assetId}`, project, fields.rootAssetId, position.assetId, position.x, position.y, timestamp);\n }\n database.close();\n return { ok: true as const, message: `Saved ${fields.positions.length} lineage positions`, root_asset_id: fields.rootAssetId, positions: fields.positions };\n}\n\nexport function getLineageNextAsset(project: string, rootAssetId?: string): LineageNextResponse {\n const database = db();\n const root = resolveRoot(database, project, rootAssetId);\n database.close();\n const snapshot = getLineageSnapshot(project, root);\n const selectedNodes = snapshot.selected\n .map(assetId => snapshot.nodes.find(node => node.asset_id === assetId))\n .filter((node): node is LineageNode => Boolean(node));\n const latestNodes = snapshot.nodes.filter(node => snapshot.latest.includes(node.asset_id));\n const warnings: string[] = [];\n for (const selectedNode of selectedNodes) {\n if (selectedNode.is_latest) continue;\n warnings.push('Selected asset is not a latest leaf; agents should treat this as an intentional branch choice.');\n }\n if (selectedNodes.length > 0) {\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'selected',\n selection_mode: selectedNodes.length > 1 ? 'multiple' : 'single',\n recommended_action: 'evolve_variations',\n reason: 'user_selected',\n next_asset: selectedNodes[0],\n next_assets: selectedNodes,\n latest: snapshot.latest,\n selected: snapshot.selected,\n selection: snapshot.selection,\n selections: snapshot.selections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n }\n if (latestNodes.length === 1) {\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'single_latest',\n selection_mode: 'fallback',\n recommended_action: 'evolve_variations',\n reason: 'single_latest_fallback',\n next_asset: latestNodes[0],\n next_assets: [latestNodes[0]],\n latest: snapshot.latest,\n selected: snapshot.selected,\n selection: snapshot.selection,\n selections: snapshot.selections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n }\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: latestNodes.length > 1 ? 'ambiguous_latest' : 'empty',\n selection_mode: 'none',\n recommended_action: latestNodes.length > 1 ? 'choose_next_base' : 'none',\n reason: latestNodes.length > 1 ? 'multiple_latest_no_selection' : 'no_lineage_candidates',\n next_asset: null,\n next_assets: [],\n latest: snapshot.latest,\n selected: snapshot.selected,\n selection: snapshot.selection,\n selections: snapshot.selections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n}\n\nexport function getLineageChildren(project: string, parentAssetId: string): LineageChildrenResponse {\n const snapshot = getLineageSnapshot(project, parentAssetId);\n const edges = snapshot.edges.filter(edge => edge.parent_asset_id === parentAssetId);\n const childIds = new Set(edges.map(edge => edge.child_asset_id));\n return {\n project, parent_asset_id: parentAssetId,\n children: snapshot.nodes.filter(node => childIds.has(node.asset_id)),\n edges, fetchedAt: nowIso(),\n };\n}\n\nexport function listLineageRerollRequests(project: string, rootAssetId: string): LineageRerollRequestsResponse {\n const database = db();\n try {\n assertCanonicalRoot(database, project, rootAssetId);\n const rows = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and status = 'pending'\n order by created_at, id\n `).all(project, rootAssetId) as Array<Record<string, unknown>>;\n return { project, root_asset_id: rootAssetId, requests: rows.map(rerollRequestFrom), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function getLineageAttempts(project: string, rootAssetId: string, nodeAssetId: string): LineageAttemptsResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, rootAssetId, nodeAssetId);\n const rows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, nodeAssetId) as Array<Record<string, unknown>>;\n const asset = database.prepare('select id asset_id, project_id project, local_path, checksum_sha256, created_at asset_created_at from assets where project_id = ? and id = ?').get(project, nodeAssetId) as { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string };\n return { project, root_asset_id: rootAssetId, node_asset_id: nodeAssetId, attempts: withImplicitAttempt(rows.map(attemptFrom), asset), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function promoteLineageAttempt(project: string, fields: {\n rootAssetId: string;\n nodeAssetId: string;\n attemptId: string;\n confirmWrite: boolean;\n}): LineageAttemptPromotionResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const asset = database.prepare('select id asset_id, project_id project, local_path, checksum_sha256, created_at asset_created_at from assets where project_id = ? and id = ?').get(project, fields.nodeAssetId) as { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string };\n const rows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, fields.nodeAssetId) as Array<Record<string, unknown>>;\n const attempts = withImplicitAttempt(rows.map(attemptFrom), asset);\n const target = attempts.find(attempt => attempt.id === fields.attemptId);\n if (!target) throw new LineageError(`Attempt ${fields.attemptId} is not in ${fields.nodeAssetId}`, 404);\n const timestamp = nowIso();\n const promotedAttempt = { ...target, is_current: true, promoted_at: timestamp };\n if (!fields.confirmWrite) {\n return {\n ok: true,\n dryRun: true,\n project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n attempt: promotedAttempt,\n attempts: attempts.map(attempt => ({ ...attempt, is_current: attempt.id === target.id, promoted_at: attempt.id === target.id ? timestamp : attempt.promoted_at })),\n fetchedAt: timestamp,\n };\n }\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, fields.nodeAssetId);\n if (target.source !== 'initial') {\n const result = database.prepare(`\n update asset_attempts\n set is_current = 1, promoted_at = ?\n where project_id = ? and node_asset_id = ? and id = ?\n `).run(timestamp, project, fields.nodeAssetId, target.id);\n if (result.changes !== 1) throw new LineageError(`Attempt ${fields.attemptId} is not in ${fields.nodeAssetId}`, 404);\n }\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n const refreshedRows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, fields.nodeAssetId) as Array<Record<string, unknown>>;\n const refreshedAttempts = withImplicitAttempt(refreshedRows.map(attemptFrom), asset);\n const attempt = refreshedAttempts.find(item => item.id === target.id) || promotedAttempt;\n return {\n ok: true,\n project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n attempt,\n attempts: refreshedAttempts,\n fetchedAt: nowIso(),\n };\n } finally {\n database.close();\n }\n}\n\nexport function recordLineageRerollAttempt(project: string, fields: {\n rootAssetId: string;\n nodeAssetId: string;\n assetId: string;\n prompt: string;\n generationJobId: string;\n filePath: string;\n checksumSha256: string;\n confirmWrite: boolean;\n}): { ok: true; attempt: LineageAttempt; dryRun?: true } {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n requireAsset(database, project, fields.assetId);\n assertAttemptAssetNotVisibleLineageNode(database, project, fields.rootAssetId, fields.assetId);\n const timestamp = nowIso();\n const maxRow = database.prepare('select max(attempt_index) max_index from asset_attempts where project_id = ? and node_asset_id = ?').get(project, fields.nodeAssetId) as { max_index?: number | null };\n const attemptIndex = Number(maxRow.max_index || 1) + 1;\n const attempt: LineageAttempt = {\n id: `${project}:${fields.nodeAssetId}:attempt:${attemptIndex}`,\n project_id: project,\n node_asset_id: fields.nodeAssetId,\n asset_id: fields.assetId,\n attempt_index: attemptIndex,\n source: 'reroll',\n prompt: fields.prompt,\n generation_job_id: fields.generationJobId,\n file_path: fields.filePath,\n checksum_sha256: fields.checksumSha256,\n created_at: timestamp,\n promoted_at: timestamp,\n is_current: true,\n };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, attempt };\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, fields.nodeAssetId);\n database.prepare(`\n insert into asset_attempts (\n id, project_id, node_asset_id, asset_id, attempt_index, source, prompt, generation_job_id,\n file_path, checksum_sha256, created_at, promoted_at, is_current\n ) values (?, ?, ?, ?, ?, 'reroll', ?, ?, ?, ?, ?, ?, 1)\n `).run(\n attempt.id, project, fields.nodeAssetId, fields.assetId, attempt.attempt_index, fields.prompt,\n fields.generationJobId, fields.filePath, fields.checksumSha256, timestamp, timestamp\n );\n database.prepare(`\n update asset_reroll_requests\n set status = 'resolved', resolved_at = ?\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n `).run(timestamp, project, fields.rootAssetId, fields.nodeAssetId);\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, 'unreviewed', ?, null, null, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, updated_at = excluded.updated_at\n `).run(fields.nodeAssetId, timestamp, timestamp);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, attempt };\n } finally {\n database.close();\n }\n}\n\nexport function markLineageRerollRequest(project: string, fields: { rootAssetId: string; nodeAssetId: string; notes?: string; requestedBy?: 'agent' | 'human' | 'system'; confirmWrite: boolean }): LineageRerollRequestMutationResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const existing = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n order by created_at desc limit 1\n `).get(project, fields.rootAssetId, fields.nodeAssetId) as Record<string, unknown> | undefined;\n const timestamp = nowIso();\n const request: LineageRerollRequest = existing ? {\n ...rerollRequestFrom(existing),\n notes: fields.notes || rerollRequestFrom(existing).notes,\n requested_by: fields.requestedBy || rerollRequestFrom(existing).requested_by,\n } : {\n id: rerollRequestId(project, fields.rootAssetId, fields.nodeAssetId, timestamp),\n project_id: project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n status: 'pending',\n requested_by: fields.requestedBy || 'human',\n notes: fields.notes,\n created_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, request };\n if (existing) {\n database.prepare(`\n update asset_reroll_requests\n set requested_by = ?, notes = ?\n where id = ?\n `).run(request.requested_by, request.notes || null, request.id);\n } else {\n database.prepare(`\n insert into asset_reroll_requests (id, project_id, root_asset_id, node_asset_id, status, requested_by, notes, created_at, resolved_at)\n values (?, ?, ?, ?, 'pending', ?, ?, ?, null)\n `).run(request.id, project, fields.rootAssetId, fields.nodeAssetId, request.requested_by, request.notes || null, request.created_at);\n }\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, 'needs_revision', ?, null, ?, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, notes = coalesce(excluded.notes, asset_reviews.notes), updated_at = excluded.updated_at\n `).run(fields.nodeAssetId, timestamp, request.notes || null, timestamp);\n return { ok: true, request: rerollRequestFrom(database.prepare('select * from asset_reroll_requests where id = ?').get(request.id) as Record<string, unknown>) };\n } finally {\n database.close();\n }\n}\n\nexport function clearLineageRerollRequest(project: string, fields: { rootAssetId: string; nodeAssetId: string; confirmWrite: boolean }): LineageRerollRequestMutationResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const existing = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n order by created_at desc limit 1\n `).get(project, fields.rootAssetId, fields.nodeAssetId) as Record<string, unknown> | undefined;\n if (!existing) throw new LineageError(`No pending re-roll request for ${fields.nodeAssetId}`, 404);\n const timestamp = nowIso();\n const request = { ...rerollRequestFrom(existing), status: 'cancelled' as const, resolved_at: timestamp };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, request };\n database.prepare(`\n update asset_reroll_requests\n set status = 'cancelled', resolved_at = ?\n where id = ?\n `).run(timestamp, request.id);\n return { ok: true, request };\n } finally {\n database.close();\n }\n}\n\nexport function updateSelectedAsset(project: string, fields: SelectionFields) {\n const database = db();\n const inputAssetIds = normalizeSelectionInput(fields);\n const root = fields.rootAssetId || (inputAssetIds[0] ? rootFor(database, project, inputAssetIds[0]) : '');\n if (!root) throw new LineageError('Selection requires rootAssetId or assetId');\n requireAsset(database, project, root);\n for (const assetId of inputAssetIds) requireAsset(database, project, assetId);\n const mode = fields.mode || 'replace';\n const limit = fields.maxSelections || LINEAGE_NEXT_VARIATION_LIMIT;\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, root_asset_id: root, asset_ids: inputAssetIds, mode, clear: Boolean(fields.clear), max_selections: limit };\n }\n const current = selectedRows(database, project, root);\n let nextIds = current.map(row => row.asset_id);\n if (fields.clear) {\n nextIds = [];\n } else if (mode === 'replace') {\n nextIds = inputAssetIds;\n } else if (mode === 'add') {\n nextIds = [...nextIds, ...inputAssetIds];\n } else if (mode === 'remove') {\n nextIds = nextIds.filter(assetId => !inputAssetIds.includes(assetId));\n } else if (mode === 'toggle') {\n for (const assetId of inputAssetIds) {\n nextIds = nextIds.includes(assetId) ? nextIds.filter(id => id !== assetId) : [...nextIds, assetId];\n }\n }\n nextIds = [...new Set(nextIds)];\n if (!fields.clear && inputAssetIds.length === 0) throw new LineageError('Selection set requires assetId or assetIds');\n if (nextIds.length > limit) throw new LineageError(`Select at most ${limit} assets for next variation`);\n database.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, root);\n const timestamp = nowIso();\n const insert = database.prepare(`\n insert into asset_selections (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n values (?, ?, ?, ?, ?, ?, ?)\n `);\n nextIds.forEach((assetId, position) => {\n const existing = current.find(row => row.asset_id === assetId);\n const notes = inputAssetIds.includes(assetId) ? fields.notes || existing?.notes : existing?.notes;\n insert.run(selectionId(project, root, assetId), project, root, assetId, position, notes || null, timestamp);\n });\n database.close();\n const message = nextIds.length === 0 ? `Cleared selected assets for ${root}` : `Selected ${nextIds.length} asset${nextIds.length === 1 ? '' : 's'} for ${root}`;\n return { ok: true as const, message, root_asset_id: root, asset_id: nextIds[0] || null, asset_ids: nextIds, mode };\n}\n\nexport function updateAssetReview(project: string, fields: ReviewFields) {\n const allowed = new Set<AssetReviewState>(['unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\n if (!allowed.has(fields.reviewState)) throw new LineageError(`Unsupported review state: ${fields.reviewState}`);\n const database = db();\n requireAsset(database, project, fields.assetId);\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, asset_id: fields.assetId, review_state: fields.reviewState, notes: fields.notes };\n }\n const timestamp = nowIso();\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, ?, ?, ?, ?, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, notes = excluded.notes, updated_at = excluded.updated_at\n `).run(fields.assetId, fields.reviewState, timestamp, fields.reviewState === 'ignored' ? timestamp : null, fields.notes || null, timestamp);\n database.close();\n return { ok: true as const, message: `Marked ${fields.assetId} ${fields.reviewState}`, asset_id: fields.assetId, review_state: fields.reviewState };\n}\n", "import type { SelectionFields } from '../shared/types';\nimport type { DatabaseSync } from './assetLineageDb';\n\nexport const LINEAGE_NEXT_VARIATION_LIMIT = 3;\n\nexport interface LineageSelectionRow {\n asset_id: string;\n notes?: string;\n position: number;\n selected_at: string;\n}\n\nexport function selectionId(project: string, root: string, assetId: string): string {\n return `${project}:${root}:selected:${assetId}`;\n}\n\nexport function selectedRows(database: DatabaseSync, project: string, root: string): LineageSelectionRow[] {\n return database.prepare(`\n select asset_id, notes, position, selected_at\n from asset_selections\n where project_id = ? and root_asset_id = ?\n order by position, selected_at, asset_id\n `).all(project, root) as unknown as LineageSelectionRow[];\n}\n\nexport function normalizeSelectionInput(fields: SelectionFields): string[] {\n return [...new Set([...(fields.assetIds || []), fields.assetId || ''].map(assetId => assetId.trim()).filter(Boolean))];\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type {\n LineageWorkspace,\n LineageWorkspaceActor,\n LineageWorkspaceFields,\n LineageWorkspaceSnapshot,\n LineageWorkspaceStatus,\n LineageWorkspaceUpdateFields,\n} from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nconst actors = new Set<LineageWorkspaceActor>(['human', 'agent', 'system']);\nconst statuses = new Set<LineageWorkspaceStatus>(['active', 'paused', 'archived']);\n\nexport class LineageWorkspaceError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageWorkspaceError(error: unknown): error is LineageWorkspaceError {\n return error instanceof LineageWorkspaceError;\n}\n\nexport function lineageWorkspaceId(project: string, rootAssetId: string): string {\n return `${project}:lineage-workspace:${rootAssetId}`;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction normalizeStatus(value: LineageWorkspaceStatus | undefined, fallback: LineageWorkspaceStatus): LineageWorkspaceStatus {\n const status = value || fallback;\n if (!statuses.has(status)) throw new LineageWorkspaceError(`Unsupported lineage workspace status: ${status}`);\n return status;\n}\n\nfunction normalizeActor(value: LineageWorkspaceActor | undefined): LineageWorkspaceActor {\n const actor = value || 'human';\n if (!actors.has(actor)) throw new LineageWorkspaceError(`Unsupported lineage workspace actor: ${actor}`);\n return actor;\n}\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): { id: string; title: string } {\n const row = database.prepare('select id, title from assets where project_id = ? and id = ?').get(project, assetId) as { id: string; title: string } | undefined;\n if (!row) throw new LineageWorkspaceError(`Unknown indexed asset: ${assetId}`, 404);\n return row;\n}\n\nfunction rowToWorkspace(row: Row): LineageWorkspace {\n return {\n id: String(row.id),\n project: String(row.project_id),\n root_asset_id: String(row.root_asset_id),\n title: String(row.title),\n status: String(row.status) as LineageWorkspaceStatus,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_by: String(row.created_by) as LineageWorkspaceActor,\n active_at: typeof row.active_at === 'string' ? row.active_at : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction workspaceById(database: DatabaseSync, project: string, id: string): LineageWorkspace | null {\n const row = database.prepare('select * from lineage_workspaces where project_id = ? and id = ?').get(project, id) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nfunction workspaceByRoot(database: DatabaseSync, project: string, rootAssetId: string): LineageWorkspace | null {\n const row = database.prepare('select * from lineage_workspaces where project_id = ? and root_asset_id = ?').get(project, rootAssetId) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nfunction knownRoots(database: DatabaseSync, project: string): Array<{ root_asset_id: string; selected_at?: string }> {\n const rows = database.prepare(`\n select root_asset_id, max(selected_at) selected_at from asset_selections where project_id = ? group by root_asset_id\n union\n select root_asset_id, null selected_at from asset_layouts where project_id = ? group by root_asset_id\n union\n select parent_asset_id root_asset_id, null selected_at\n from asset_edges\n where project_id = ?\n and parent_asset_id not in (select child_asset_id from asset_edges where project_id = ?)\n group by parent_asset_id\n `).all(project, project, project, project) as Array<{ root_asset_id: string; selected_at?: string | null }>;\n return rows.map(row => ({ root_asset_id: row.root_asset_id, selected_at: row.selected_at || undefined }));\n}\n\nfunction seedLegacyWorkspaces(database: DatabaseSync, project: string): void {\n ensureProject(database, project);\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into lineage_workspaces (\n id, project_id, root_asset_id, title, status, notes, created_by, active_at, created_at, updated_at\n )\n select ?, ?, a.id, a.title || ' lineage', 'active', null, 'system', ?, ?, ?\n from assets a\n where a.project_id = ? and a.id = ?\n on conflict(project_id, root_asset_id) do nothing\n `);\n for (const root of knownRoots(database, project)) {\n statement.run(\n lineageWorkspaceId(project, root.root_asset_id),\n project,\n root.selected_at || null,\n timestamp,\n timestamp,\n project,\n root.root_asset_id\n );\n }\n}\n\nfunction listRows(database: DatabaseSync, project: string): LineageWorkspace[] {\n return (database.prepare(`\n select * from lineage_workspaces\n where project_id = ?\n order by\n case status when 'active' then 0 when 'paused' then 1 else 2 end,\n active_at desc nulls last,\n updated_at desc,\n title\n `).all(project) as Row[]).map(rowToWorkspace);\n}\n\nfunction activeWorkspace(database: DatabaseSync, project: string): LineageWorkspace | null {\n const row = database.prepare(`\n select * from lineage_workspaces\n where project_id = ? and status != 'archived'\n order by active_at desc nulls last, updated_at desc\n limit 1\n `).get(project) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nexport function listLineageWorkspaces(project: string): LineageWorkspaceSnapshot {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n return {\n project,\n active_workspace: activeWorkspace(database, project),\n workspaces: listRows(database, project),\n fetchedAt: nowIso(),\n };\n } finally {\n database.close();\n }\n}\n\nexport function inspectLineageWorkspace(project: string, workspaceId: string): LineageWorkspace {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const workspace = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!workspace) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n return workspace;\n } finally {\n database.close();\n }\n}\n\nexport function createLineageWorkspace(project: string, fields: LineageWorkspaceFields) {\n const rootAssetId = fields.rootAssetId.trim();\n if (!rootAssetId) throw new LineageWorkspaceError('Lineage workspace requires rootAssetId');\n const status = normalizeStatus(fields.status, 'active');\n const actor = normalizeActor(fields.createdBy);\n const database = lineageDb();\n try {\n const root = requireAsset(database, project, rootAssetId);\n const timestamp = nowIso();\n const workspace: LineageWorkspace = {\n id: lineageWorkspaceId(project, rootAssetId),\n project,\n root_asset_id: rootAssetId,\n title: fields.title?.trim() || `${root.title} lineage`,\n status,\n notes: fields.notes?.trim() || undefined,\n created_by: actor,\n active_at: fields.activate !== false && status !== 'archived' ? timestamp : undefined,\n created_at: timestamp,\n updated_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, workspace };\n ensureProject(database, project);\n database.prepare(`\n insert into lineage_workspaces (\n id, project_id, root_asset_id, title, status, notes, created_by, active_at, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, root_asset_id) do update set\n title = excluded.title,\n status = excluded.status,\n notes = excluded.notes,\n active_at = coalesce(excluded.active_at, lineage_workspaces.active_at),\n updated_at = excluded.updated_at\n `).run(\n workspace.id,\n project,\n workspace.root_asset_id,\n workspace.title,\n workspace.status,\n workspace.notes || null,\n workspace.created_by,\n workspace.active_at || null,\n workspace.created_at,\n workspace.updated_at\n );\n return {\n ok: true as const,\n message: `Saved lineage workspace ${workspace.title}`,\n workspace: workspaceById(database, project, workspace.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function updateLineageWorkspace(project: string, workspaceId: string, fields: LineageWorkspaceUpdateFields) {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const current = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!current) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n const timestamp = nowIso();\n const next: LineageWorkspace = {\n ...current,\n title: fields.title?.trim() || current.title,\n status: normalizeStatus(fields.status, current.status),\n notes: fields.notes === undefined ? current.notes : fields.notes.trim() || undefined,\n active_at: fields.activate ? timestamp : current.active_at,\n updated_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, workspace: next };\n database.prepare(`\n update lineage_workspaces\n set title = ?, status = ?, notes = ?, active_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(next.title, next.status, next.notes || null, next.active_at || null, timestamp, project, current.id);\n return {\n ok: true as const,\n message: `Updated lineage workspace ${next.title}`,\n workspace: workspaceById(database, project, current.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function activateLineageWorkspace(project: string, workspaceId: string, confirmWrite: boolean) {\n return updateLineageWorkspace(project, workspaceId, { activate: true, status: 'active', confirmWrite });\n}\n\nexport function archiveLineageWorkspace(project: string, workspaceId: string, confirmWrite: boolean) {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const current = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!current) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n const timestamp = nowIso();\n const next: LineageWorkspace = {\n ...current,\n status: 'archived',\n active_at: undefined,\n updated_at: timestamp,\n };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, workspace: next };\n database.prepare(`\n update lineage_workspaces\n set status = 'archived', active_at = null, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, project, current.id);\n database.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, current.root_asset_id);\n return {\n ok: true as const,\n message: `Archived lineage workspace ${current.title}`,\n workspace: workspaceById(database, project, current.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function activeLineageWorkspaceRoot(project: string): string | undefined {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n return activeWorkspace(database, project)?.root_asset_id;\n } finally {\n database.close();\n }\n}\n", "import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\n\nexport type AgentClaimScopeType = 'lineage_workspace' | 'content_post' | 'content_queue_lane' | 'selection_set' | 'project_channel';\ntype AgentClaimStatus = 'active' | 'expired' | 'released' | 'revoked' | 'transferred';\n\nexport interface AgentClaim {\n id: string;\n project: string;\n channel?: string;\n scope_type: AgentClaimScopeType;\n target_id: string;\n target_title?: string;\n agent_id?: string;\n agent_name: string;\n agent_kind: string;\n thread_id?: string;\n status: AgentClaimStatus;\n created_at: string;\n heartbeat_at: string;\n expires_at: string;\n released_at?: string;\n revoked_at?: string;\n revoked_by?: string;\n override_reason?: string;\n metadata?: Record<string, unknown>;\n heartbeat_age_seconds: number;\n derived_state: 'active' | 'idle' | 'stale' | 'expired';\n}\n\ninterface AgentClaimEvent {\n claim_id: string;\n event_type: string;\n actor?: string;\n message?: string;\n created_at: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateAgentClaimFields {\n project: string;\n channel?: string;\n scopeType: AgentClaimScopeType;\n targetId: string;\n targetTitle?: string;\n agentId?: string;\n agentName: string;\n agentKind?: string;\n threadId?: string;\n ttlSeconds?: number;\n force?: boolean;\n reason?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ValidateAgentClaimForWriteFields {\n claimToken?: string;\n project: string;\n channel?: string;\n scopeType: AgentClaimScopeType;\n targetId: string;\n writeKind: string;\n dangerLevel: 'claim' | 'warn' | 'enforce' | 'danger';\n confirmWrite?: boolean;\n}\n\nexport type AgentClaimValidationResult =\n | { ok: true; claim: AgentClaim; warnings: string[] }\n | { ok: false; code: string; message: string; conflicts: AgentClaim[] };\n\ntype Row = Record<string, unknown>;\n\nconst defaultTtlSeconds = 20 * 60;\nconst idleAfterSeconds = 5 * 60;\nconst staleAfterSeconds = 15 * 60;\nconst scopes = new Set<AgentClaimScopeType>(['lineage_workspace', 'content_post', 'content_queue_lane', 'selection_set', 'project_channel']);\nconst claimTokenPattern = /claim_[a-z0-9_-]+\\.[A-Za-z0-9_-]+/g;\n\nexport class AgentClaimError extends Error {\n constructor(message: string, public status = 400, public code = 'agent_claim_error', public conflicts: AgentClaim[] = []) {\n super(message);\n }\n}\n\nexport function isAgentClaimError(error: unknown): error is AgentClaimError {\n return error instanceof AgentClaimError;\n}\n\nexport function redactAgentClaimTokens(input: string): string {\n return input.replace(claimTokenPattern, '[redacted-claim-token]');\n}\n\nexport function parseClaimTtl(value?: string): number {\n if (!value) return defaultTtlSeconds;\n const match = value.trim().match(/^(\\d+)(s|m|h)?$/);\n if (!match) throw new AgentClaimError(`Invalid claim ttl: ${value}`);\n const amount = Number(match[1]);\n const unit = match[2] || 's';\n const multiplier = unit === 'h' ? 3600 : unit === 'm' ? 60 : 1;\n const seconds = amount * multiplier;\n if (!Number.isInteger(seconds) || seconds < 30 || seconds > 24 * 60 * 60) {\n throw new AgentClaimError('Claim ttl must be between 30 seconds and 24 hours');\n }\n return seconds;\n}\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${randomBytes(6).toString('base64url').toLowerCase()}`;\n}\n\nfunction tokenHash(token: string): string {\n return createHash('sha256').update(token).digest('hex');\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const left = Buffer.from(a);\n const right = Buffer.from(b);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\nfunction expiresAtFrom(timestamp: string, ttlSeconds: number): string {\n return new Date(new Date(timestamp).getTime() + ttlSeconds * 1000).toISOString();\n}\n\nfunction metadataJson(metadata?: Record<string, unknown>): string | null {\n return metadata ? JSON.stringify(metadata) : null;\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== 'string' || !value) return undefined;\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction derivedState(row: { status: AgentClaimStatus; heartbeat_at: string; expires_at: string }, now = new Date()): AgentClaim['derived_state'] {\n if (row.status !== 'active') return row.status === 'expired' ? 'expired' : 'stale';\n if (new Date(row.expires_at).getTime() <= now.getTime()) return 'expired';\n const ageSeconds = Math.max(0, Math.floor((now.getTime() - new Date(row.heartbeat_at).getTime()) / 1000));\n if (ageSeconds >= staleAfterSeconds) return 'stale';\n if (ageSeconds >= idleAfterSeconds) return 'idle';\n return 'active';\n}\n\nfunction rowToClaim(row: Row, now = new Date()): AgentClaim {\n const heartbeatAt = String(row.heartbeat_at);\n return {\n id: String(row.id),\n project: String(row.project_id),\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n scope_type: String(row.scope_type) as AgentClaimScopeType,\n target_id: String(row.target_id),\n target_title: typeof row.target_title === 'string' ? row.target_title : undefined,\n agent_id: typeof row.agent_id === 'string' ? row.agent_id : undefined,\n agent_name: String(row.agent_name),\n agent_kind: String(row.agent_kind),\n thread_id: typeof row.thread_id === 'string' ? row.thread_id : undefined,\n status: String(row.status) as AgentClaimStatus,\n created_at: String(row.created_at),\n heartbeat_at: heartbeatAt,\n expires_at: String(row.expires_at),\n released_at: typeof row.released_at === 'string' ? row.released_at : undefined,\n revoked_at: typeof row.revoked_at === 'string' ? row.revoked_at : undefined,\n revoked_by: typeof row.revoked_by === 'string' ? row.revoked_by : undefined,\n override_reason: typeof row.override_reason === 'string' ? row.override_reason : undefined,\n metadata: parseMetadata(row.metadata_json),\n heartbeat_age_seconds: Math.max(0, Math.floor((now.getTime() - new Date(heartbeatAt).getTime()) / 1000)),\n derived_state: derivedState({\n expires_at: String(row.expires_at),\n heartbeat_at: heartbeatAt,\n status: String(row.status) as AgentClaimStatus,\n }, now),\n };\n}\n\nfunction eventToRow(row: Row): AgentClaimEvent {\n return {\n claim_id: String(row.claim_id),\n event_type: String(row.event_type),\n actor: typeof row.actor === 'string' ? row.actor : undefined,\n message: typeof row.message === 'string' ? row.message : undefined,\n created_at: String(row.created_at),\n metadata: parseMetadata(row.metadata_json),\n };\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction recordEvent(database: DatabaseSync, claimId: string, eventType: string, actor?: string, message?: string, metadata?: Record<string, unknown>): void {\n database.prepare(`\n insert into agent_claim_events (id, claim_id, event_type, actor, message, created_at, metadata_json)\n values (?, ?, ?, ?, ?, ?, ?)\n `).run(randomId('claim_event'), claimId, eventType, actor || null, message || null, nowIso(), metadataJson(metadata));\n}\n\nfunction expireActiveClaims(database: DatabaseSync): void {\n const timestamp = nowIso();\n const expired = database.prepare(`\n select id from agent_claims where status = 'active' and expires_at <= ?\n `).all(timestamp) as Array<{ id: string }>;\n if (expired.length === 0) return;\n database.prepare(`\n update agent_claims set status = 'expired' where status = 'active' and expires_at <= ?\n `).run(timestamp);\n for (const claim of expired) recordEvent(database, claim.id, 'expired', 'system', 'Claim expired after missed heartbeat.');\n}\n\nfunction normalizeScope(scopeType: AgentClaimScopeType): AgentClaimScopeType {\n if (!scopes.has(scopeType)) throw new AgentClaimError(`Unsupported claim scope: ${scopeType}`);\n return scopeType;\n}\n\nfunction channelOverlaps(left?: string, right?: string): boolean {\n return !left || !right || left === right;\n}\n\nfunction claimOverlaps(candidate: Pick<AgentClaim, 'project' | 'channel' | 'scope_type' | 'target_id'>, existing: AgentClaim): boolean {\n if (candidate.project !== existing.project) return false;\n if (!channelOverlaps(candidate.channel, existing.channel)) return false;\n if (candidate.scope_type === existing.scope_type && candidate.target_id === existing.target_id) return true;\n return candidate.scope_type === 'project_channel' || existing.scope_type === 'project_channel';\n}\n\nfunction activeClaims(database: DatabaseSync, project?: string): AgentClaim[] {\n const rows = project\n ? database.prepare(\"select * from agent_claims where project_id = ? and status = 'active' order by heartbeat_at desc\").all(project)\n : database.prepare(\"select * from agent_claims where status = 'active' order by project_id, heartbeat_at desc\").all();\n return (rows as Row[]).map(row => rowToClaim(row));\n}\n\nfunction findClaimById(database: DatabaseSync, claimId: string, project?: string): AgentClaim | null {\n const row = project\n ? database.prepare('select * from agent_claims where project_id = ? and id = ?').get(project, claimId)\n : database.prepare('select * from agent_claims where id = ?').get(claimId);\n return row ? rowToClaim(row as Row) : null;\n}\n\nfunction findClaimRowByToken(database: DatabaseSync, claimToken: string): Row | null {\n const claimId = claimToken.split('.')[0];\n const row = database.prepare('select * from agent_claims where id = ?').get(claimId) as Row | undefined;\n if (!row) return null;\n return safeEqual(String(row.token_hash), tokenHash(claimToken)) ? row : null;\n}\n\nfunction denied(code: string, message: string, conflicts: AgentClaim[] = []): AgentClaimValidationResult {\n return { ok: false, code, message, conflicts };\n}\n\nfunction scopeAllowsWrite(claim: AgentClaim, scopeType: AgentClaimScopeType, targetId: string, writeKind: string): boolean {\n if (claim.scope_type === scopeType && claim.target_id === targetId) return true;\n if (claim.scope_type === 'project_channel') return true;\n if (claim.scope_type === 'lineage_workspace' && scopeType === 'lineage_workspace') return claim.target_id === targetId;\n if (claim.scope_type === 'content_queue_lane' && writeKind === 'content_queue_next') return true;\n return false;\n}\n\nexport function createAgentClaim(fields: CreateAgentClaimFields) {\n const project = fields.project.trim();\n const targetId = fields.targetId.trim();\n const agentName = fields.agentName.trim();\n if (!project) throw new AgentClaimError('Agent claim requires project');\n if (!targetId) throw new AgentClaimError('Agent claim requires target');\n if (!agentName) throw new AgentClaimError('Agent claim requires agent name');\n const scopeType = normalizeScope(fields.scopeType);\n const ttlSeconds = fields.ttlSeconds || defaultTtlSeconds;\n const database = lineageDb();\n try {\n ensureProject(database, project);\n expireActiveClaims(database);\n const candidate = { project, channel: fields.channel?.trim() || undefined, scope_type: scopeType, target_id: targetId };\n const conflicts = activeClaims(database, project).filter(claim => claimOverlaps(candidate, claim));\n if (conflicts.length > 0 && !fields.force) {\n throw new AgentClaimError('Target already has an active overlapping agent claim.', 409, 'target_already_claimed', conflicts);\n }\n if (conflicts.length > 0 && !fields.reason?.trim()) {\n throw new AgentClaimError('Overriding an active claim requires --reason.', 400, 'override_reason_required', conflicts);\n }\n const timestamp = nowIso();\n for (const conflict of conflicts) {\n database.prepare(`\n update agent_claims\n set status = 'revoked', revoked_at = ?, revoked_by = ?, override_reason = ?\n where id = ? and status = 'active'\n `).run(timestamp, agentName, fields.reason || null, conflict.id);\n recordEvent(database, conflict.id, 'revoked', agentName, fields.reason || 'Revoked by forced claim takeover.');\n recordEvent(database, conflict.id, 'conflict', agentName, `Overridden by ${agentName}.`, { new_claim_target: targetId });\n }\n const id = randomId('claim');\n const secret = randomBytes(24).toString('base64url');\n const claimToken = `${id}.${secret}`;\n const expiresAt = expiresAtFrom(timestamp, ttlSeconds);\n database.prepare(`\n insert into agent_claims (\n id, token_hash, project_id, channel, scope_type, target_id, target_title, agent_id, agent_name,\n agent_kind, thread_id, status, created_at, heartbeat_at, expires_at, metadata_json\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, ?, ?)\n `).run(\n id,\n tokenHash(claimToken),\n project,\n candidate.channel || null,\n scopeType,\n targetId,\n fields.targetTitle?.trim() || null,\n fields.agentId?.trim() || null,\n agentName,\n fields.agentKind?.trim() || 'codex',\n fields.threadId?.trim() || null,\n timestamp,\n timestamp,\n expiresAt,\n metadataJson(fields.metadata)\n );\n recordEvent(database, id, 'created', agentName, `Claimed ${scopeType} ${targetId}.`, { ttl_seconds: ttlSeconds });\n const claim = findClaimById(database, id);\n return { ok: true as const, claim, claim_token: claimToken, conflicts_revoked: conflicts.map(conflict => conflict.id) };\n } finally {\n database.close();\n }\n}\n\nexport function listAgentClaims(project?: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const rows = project\n ? database.prepare('select * from agent_claims where project_id = ? order by status, heartbeat_at desc').all(project)\n : database.prepare('select * from agent_claims order by project_id, status, heartbeat_at desc').all();\n return { ok: true as const, claims: (rows as Row[]).map(row => rowToClaim(row)), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function inspectAgentClaim(claimId: string, project?: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n const events = database.prepare('select * from agent_claim_events where claim_id = ? order by created_at').all(claim.id) as Row[];\n return { ok: true as const, claim, events: events.map(eventToRow) };\n } finally {\n database.close();\n }\n}\n\nexport function heartbeatAgentClaim(claimToken: string, ttlSeconds = defaultTtlSeconds) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, claimToken);\n if (!row) throw new AgentClaimError('Unknown or invalid agent claim token.', 401, 'claim_token_invalid');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n const timestamp = nowIso();\n database.prepare('update agent_claims set heartbeat_at = ?, expires_at = ? where id = ?').run(timestamp, expiresAtFrom(timestamp, ttlSeconds), claim.id);\n recordEvent(database, claim.id, 'heartbeat', claim.agent_name, 'Claim heartbeat received.');\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function releaseAgentClaim(claimToken: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, claimToken);\n if (!row) throw new AgentClaimError('Unknown or invalid agent claim token.', 401, 'claim_token_invalid');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n const timestamp = nowIso();\n database.prepare(\"update agent_claims set status = 'released', released_at = ? where id = ?\").run(timestamp, claim.id);\n recordEvent(database, claim.id, 'released', claim.agent_name, 'Claim released by token holder.');\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function releaseStaleAgentClaim(project: string, claimId: string, fields: { actor?: string; confirmWrite: boolean; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Releasing a stale agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n if (!fields.reason?.trim()) throw new AgentClaimError('Releasing a stale agent claim requires a reason.', 400, 'reason_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n if (claim.status !== 'active' || claim.derived_state !== 'stale') {\n throw new AgentClaimError('Only stale active claims can be released without the claim token.', 409, 'claim_not_stale', [claim]);\n }\n const timestamp = nowIso();\n database.prepare(\"update agent_claims set status = 'released', released_at = ?, revoked_by = ?, override_reason = ? where id = ?\").run(timestamp, fields.actor || 'human', fields.reason, claim.id);\n recordEvent(database, claim.id, 'released', fields.actor || 'human', fields.reason);\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function revokeAgentClaim(project: string, claimId: string, fields: { actor?: string; confirmWrite: boolean; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Revoking an agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n if (!fields.reason?.trim()) throw new AgentClaimError('Revoking an agent claim requires a reason.', 400, 'reason_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n const timestamp = nowIso();\n database.prepare(`\n update agent_claims set status = 'revoked', revoked_at = ?, revoked_by = ?, override_reason = ?\n where id = ?\n `).run(timestamp, fields.actor || 'human', fields.reason, claim.id);\n recordEvent(database, claim.id, 'revoked', fields.actor || 'human', fields.reason);\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function transferAgentClaim(project: string, claimId: string, fields: { confirmWrite: boolean; toAgentName: string; actor?: string; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Transferring an agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n const toAgentName = fields.toAgentName.trim();\n if (!toAgentName) throw new AgentClaimError('Transfer requires toAgentName.', 400, 'agent_name_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n database.prepare('update agent_claims set agent_name = ? where id = ?').run(toAgentName, claim.id);\n recordEvent(database, claim.id, 'transferred', fields.actor || 'human', fields.reason || `Transferred claim to ${toAgentName}.`, { to_agent_name: toAgentName });\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function validateAgentClaimForWrite(fields: ValidateAgentClaimForWriteFields): AgentClaimValidationResult {\n if (fields.dangerLevel === 'danger' && !fields.confirmWrite) {\n return denied('human_confirmation_required', 'Dangerous write requires explicit human confirmation.');\n }\n if (!fields.claimToken) return denied('claim_required', 'Mutating agent write requires a matching claim token.');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, fields.claimToken);\n if (!row) return denied('claim_token_invalid', 'Unknown or invalid claim token.');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') return denied('claim_not_active', `Agent claim is ${claim.status}.`);\n if (new Date(claim.expires_at).getTime() <= Date.now()) return denied('claim_expired', 'Agent claim has expired.');\n if (claim.project !== fields.project) return denied('claim_project_mismatch', `Claim project ${claim.project} does not match ${fields.project}.`, [claim]);\n if (fields.channel && claim.channel && claim.channel !== fields.channel) {\n return denied('claim_channel_mismatch', `Claim channel ${claim.channel} does not match ${fields.channel}.`, [claim]);\n }\n if (!scopeAllowsWrite(claim, fields.scopeType, fields.targetId, fields.writeKind)) {\n return denied('claim_scope_mismatch', `Claim does not cover ${fields.scopeType} ${fields.targetId}.`, [claim]);\n }\n recordEvent(database, claim.id, 'write_allowed', claim.agent_name, `${fields.writeKind} allowed.`, {\n danger_level: fields.dangerLevel,\n target_id: fields.targetId,\n write_kind: fields.writeKind,\n });\n return { ok: true, claim, warnings: [] };\n } finally {\n database.close();\n }\n}\n", "import { AgentClaimError, listAgentClaims, validateAgentClaimForWrite } from './agentClaims';\nimport { lineageWorkspaceId } from './assetLineageWorkspaces';\n\nfunction channelOverlaps(left?: string, right?: string): boolean {\n return !left || !right || left === right;\n}\n\nfunction hasActiveLineageWorkspaceClaim(project: string, targetId: string, channel?: string): boolean {\n return listAgentClaims(project).claims.some(claim => {\n if (claim.project !== project || claim.status !== 'active' || claim.derived_state === 'expired') return false;\n if (claim.scope_type === 'lineage_workspace') return claim.target_id === targetId;\n return claim.scope_type === 'project_channel' && channelOverlaps(channel, claim.channel);\n });\n}\n\nexport function requireLineageWorkspaceClaimForWrite(fields: {\n channel?: string;\n claimToken?: string;\n confirmWrite: boolean;\n project: string;\n rootAssetId: string;\n writeKind: string;\n}): void {\n if (!fields.confirmWrite) return;\n const targetId = lineageWorkspaceId(fields.project, fields.rootAssetId);\n if (!fields.claimToken && !hasActiveLineageWorkspaceClaim(fields.project, targetId, fields.channel)) return;\n const validation = validateAgentClaimForWrite({\n channel: fields.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n dangerLevel: 'enforce',\n project: fields.project,\n scopeType: 'lineage_workspace',\n targetId,\n writeKind: fields.writeKind,\n });\n if (!validation.ok) {\n const status = validation.code === 'claim_required' || validation.code === 'claim_token_invalid' ? 401 : 409;\n throw new AgentClaimError(validation.message, status, validation.code, validation.conflicts);\n }\n}\n", "import type { LineageBriefResponse, LineageSelectedChildFields } from '../shared/types';\nimport { AgentClaimError, validateAgentClaimForWrite } from './agentClaims';\nimport { getLineageNextAsset, getLineageWriteClaimContext, LineageError, linkLineageAssets } from './assetLineage';\nimport { lineageDbPath, nowIso } from './assetLineageDb';\nimport { lineageWorkspaceId } from './assetLineageWorkspaces';\n\nconst publicPackageCommand = 'npx @mean-weasel/lineage';\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction lineageCommand(command: string, project: string, rootAssetId: string): string {\n return `${publicPackageCommand} ${command} --project ${shellQuote(project)} --root ${shellQuote(rootAssetId)} --db ${shellQuote(lineageDbPath())} --json`;\n}\n\nfunction linkChildCommand(project: string, rootAssetId: string): string {\n return `${publicPackageCommand} link-child --project ${shellQuote(project)} --root ${shellQuote(rootAssetId)} --child <asset-id> --confirm-write --db ${shellQuote(lineageDbPath())} --json`;\n}\n\nexport function getLineageBrief(project: string, rootAssetId?: string): LineageBriefResponse {\n const next = getLineageNextAsset(project, rootAssetId);\n const assets = next.next_assets;\n const asset = next.next_asset;\n const referenceAssetIds = assets.map(item => item.asset_id);\n const rationale = next.selections.map(selection => selection.notes).find(Boolean) || asset?.selection_note || next.selection?.notes;\n const channels = [...new Set(assets.map(item => item.channel || 'unknown'))];\n const campaigns = [...new Set(assets.map(item => item.campaign || 'unknown'))];\n const prompt = assets.length > 0\n ? [\n assets.length === 1\n ? `Create 3-4 variations from asset ${assets[0].asset_id} (${assets[0].title}).`\n : `Create 3-4 variations using these ${assets.length} selected references: ${referenceAssetIds.join(', ')}.`,\n rationale ? `Preserve this selection rationale: ${rationale}` : 'Preserve the strongest visible ideas while exploring distinct alternatives.',\n `Keep project=${project}, root=${next.root_asset_id}, channels=${channels.join(',')}, campaigns=${campaigns.join(',')}.`,\n 'After generation, index outputs and link chosen children with lineage link-child.',\n ].join(' ')\n : 'Select one to three latest lineage candidates before generating variations.';\n return {\n project,\n root_asset_id: next.root_asset_id,\n strategy: next.strategy,\n selection_mode: next.selection_mode,\n recommended_action: next.recommended_action,\n reason: next.reason,\n next_asset: asset,\n next_assets: assets,\n selection: next.selection,\n selections: next.selections,\n latest: next.latest,\n warnings: next.warnings,\n brief: {\n title: asset ? `Evolve ${assets.length > 1 ? `${assets.length} selected bases` : asset.title}` : 'Choose next lineage base',\n objective: asset ? 'Generate the next branch of visual variations from the selected lineage base or bases.' : 'Resolve the next base before generation.',\n prompt,\n reference_asset_id: asset?.asset_id,\n reference_asset_ids: referenceAssetIds,\n rationale,\n },\n handoff: {\n next_command: lineageCommand('next', project, next.root_asset_id),\n inspect_command: asset ? `${publicPackageCommand} inspect --project ${shellQuote(project)} --asset-id ${shellQuote(asset.asset_id)} --db ${shellQuote(lineageDbPath())} --json` : undefined,\n link_child_command: asset ? linkChildCommand(project, next.root_asset_id) : undefined,\n },\n fetchedAt: nowIso(),\n };\n}\n\nexport function linkSelectedLineageChild(project: string, fields: LineageSelectedChildFields) {\n const next = getLineageNextAsset(project, fields.rootAssetId);\n if (!next.next_asset) throw new LineageError('Cannot link child until a next base is selected or unambiguous');\n if (fields.confirmWrite) {\n const claimContext = getLineageWriteClaimContext(project, next.next_asset.asset_id);\n const validation = validateAgentClaimForWrite({\n channel: claimContext.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n dangerLevel: 'enforce',\n project,\n scopeType: 'lineage_workspace',\n targetId: lineageWorkspaceId(project, claimContext.rootAssetId),\n writeKind: 'link_child',\n });\n if (!validation.ok) throw new AgentClaimError(validation.message, validation.code === 'claim_required' ? 401 : 403, validation.code, validation.conflicts);\n }\n const result = linkLineageAssets(project, {\n childAssetId: fields.childAssetId,\n confirmWrite: fields.confirmWrite,\n claimToken: fields.claimToken,\n parentAssetId: next.next_asset.asset_id,\n });\n return {\n ...result,\n root_asset_id: next.root_asset_id,\n parent_asset_id: next.next_asset.asset_id,\n child_asset_id: fields.childAssetId,\n reference_asset_ids: next.next_assets.map(asset => asset.asset_id),\n warning: next.next_assets.length > 1\n ? 'Linked child to the primary selected base; add explicit edges to other selected references if the child derives from them too.'\n : undefined,\n };\n}\n", "import { lineageDb as db, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { selectedRows, selectionId } from './assetLineageSelection';\nimport { getLineageSnapshot, LineageError } from './assetLineage';\nimport { requireLineageWorkspaceClaimForWrite } from './lineageClaimGuards';\nimport type { LineageRemoveNodeFields, LineageRemoveNodeResponse } from '../shared/types';\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): void {\n const row = database.prepare('select id from assets where project_id = ? and id = ?').get(project, assetId);\n if (!row) throw new LineageError(`Unknown indexed asset: ${assetId}`, 404);\n}\n\nfunction assetChannel(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select channel from assets where project_id = ? and id = ?').get(project, assetId) as { channel?: string } | undefined;\n return row?.channel;\n}\n\nfunction parentOf(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select parent_asset_id from asset_edges where project_id = ? and child_asset_id = ? order by created_at limit 1').get(project, assetId) as { parent_asset_id?: string } | undefined;\n return row?.parent_asset_id;\n}\n\nfunction rootFor(database: DatabaseSync, project: string, assetId: string): string {\n let root = assetId;\n const seen = new Set<string>();\n while (!seen.has(root)) {\n seen.add(root);\n const parent = parentOf(database, project, root);\n if (!parent) return root;\n root = parent;\n }\n return assetId;\n}\n\nfunction edgeId(project: string, parent: string, child: string): string {\n return `${project}:${parent}:derived_from:${child}`;\n}\n\nfunction compactSelectionsAfterRemove(database: DatabaseSync, project: string, root: string, assetId: string, timestamp: string): boolean {\n const current = selectedRows(database, project, root);\n const next = current.filter(row => row.asset_id !== assetId);\n if (next.length === current.length) return false;\n database.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, root);\n const insert = database.prepare(`\n insert into asset_selections (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n values (?, ?, ?, ?, ?, ?, ?)\n `);\n next.forEach((row, position) => {\n insert.run(selectionId(project, root, row.asset_id), project, root, row.asset_id, position, row.notes || null, timestamp);\n });\n return true;\n}\n\nexport function removeLineageNode(project: string, fields: LineageRemoveNodeFields): LineageRemoveNodeResponse {\n const database = db();\n requireAsset(database, project, fields.assetId);\n const root = fields.rootAssetId || rootFor(database, project, fields.assetId);\n requireAsset(database, project, root);\n if (fields.assetId === root) {\n database.close();\n throw new LineageError('Cannot remove the root lineage node; archive the workspace or create a new root instead.');\n }\n const snapshot = getLineageSnapshot(project, root);\n if (!snapshot.nodes.some(node => node.asset_id === fields.assetId)) {\n database.close();\n throw new LineageError(`Asset ${fields.assetId} is not in lineage rooted at ${root}`, 404);\n }\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: assetChannel(database, project, root),\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: root,\n writeKind: 'lineage_remove_node',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n const parentEdges = snapshot.edges.filter(edge => edge.child_asset_id === fields.assetId);\n const childEdges = snapshot.edges.filter(edge => edge.parent_asset_id === fields.assetId);\n const removedIds = [...parentEdges, ...childEdges].map(edge => edge.id);\n const timestamp = nowIso();\n const reparentedEdges = parentEdges.flatMap(parentEdge => childEdges\n .filter(childEdge => parentEdge.parent_asset_id !== childEdge.child_asset_id)\n .map(childEdge => ({\n id: edgeId(project, parentEdge.parent_asset_id, childEdge.child_asset_id),\n parent_asset_id: parentEdge.parent_asset_id,\n child_asset_id: childEdge.child_asset_id,\n relation_type: 'derived_from' as const,\n created_at: timestamp,\n })));\n const selectionRemoved = selectedRows(database, project, root).some(row => row.asset_id === fields.assetId);\n if (!fields.confirmWrite) {\n database.close();\n return {\n ok: true, dryRun: true, asset_id: fields.assetId, root_asset_id: root,\n removed_edge_ids: removedIds, reparented_edges: reparentedEdges, selection_removed: selectionRemoved, asset_preserved: true,\n };\n }\n try {\n database.exec('begin immediate transaction');\n const deleteEdge = database.prepare('delete from asset_edges where id = ? and project_id = ?');\n for (const edgeIdToRemove of removedIds) deleteEdge.run(edgeIdToRemove, project);\n const insertEdge = database.prepare(`\n insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?)\n on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing\n `);\n for (const edge of reparentedEdges) insertEdge.run(edge.id, project, edge.parent_asset_id, edge.child_asset_id, edge.created_at);\n database.prepare('delete from asset_layouts where project_id = ? and root_asset_id = ? and asset_id = ?').run(project, root, fields.assetId);\n compactSelectionsAfterRemove(database, project, root, fields.assetId, timestamp);\n database.exec('commit');\n } catch (error) {\n database.exec('rollback');\n database.close();\n throw error;\n }\n database.close();\n return {\n ok: true, message: `Removed ${fields.assetId} from lineage ${root}`, asset_id: fields.assetId, root_asset_id: root,\n removed_edge_ids: removedIds, reparented_edges: reparentedEdges, selection_removed: selectionRemoved, asset_preserved: true,\n };\n}\n", "import { defaultProject, listAssets, repoRoot } from './assetCore';\nimport { lineageDb, lineageDbPath, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { ledgerWorkflowStates, upsertLedgerPlacementsForAsset, upsertLedgerWorkflowAsset } from './assetLedgerWorkflow';\nimport type {\n AssetLedgerIndexOptions,\n AssetLedgerIndexRun,\n AssetLedgerIndexSourceMode,\n AssetLedgerIndexSummary,\n AssetLedgerRecord,\n AssetLedgerSnapshot,\n AssetLedgerSource,\n AssetLedgerSourceType,\n GrowthAsset,\n ListAssetsOptions,\n} from '../shared/types';\n\ninterface LedgerRecordRow {\n id: string;\n project_id: string;\n canonical_asset_id: string;\n checksum_sha256: string | null;\n media_type: AssetLedgerRecord['media_type'];\n title: string;\n status: string;\n channel: string | null;\n campaign: string | null;\n audience: string | null;\n updated_at: string;\n first_seen_at: string | null;\n last_seen_at: string;\n indexed_by_run_id: string | null;\n}\n\ninterface LedgerSourceRow {\n id: string;\n record_id: string;\n source_type: AssetLedgerSourceType;\n asset_id: string | null;\n local_path: string | null;\n s3_bucket: string | null;\n s3_region: string | null;\n s3_key: string | null;\n s3_version_id: string | null;\n etag: string | null;\n size_bytes: number | null;\n content_type: string | null;\n updated_at: string | null;\n first_seen_at: string | null;\n last_seen_at: string;\n indexed_by_run_id: string | null;\n}\n\ninterface LedgerRunRow {\n id: string;\n project_id: string;\n source_mode: AssetLedgerIndexSourceMode;\n include_live_s3: number;\n status: AssetLedgerIndexRun['status'];\n started_at: string;\n completed_at: string | null;\n assets_indexed: number;\n records_after: number;\n catalog_sources_after: number;\n local_sources_after: number;\n s3_sources_after: number;\n error: string | null;\n}\n\ninterface IndexContext {\n runId?: string;\n seenAt?: string;\n}\n\nfunction allAssets(project: string, source: ListAssetsOptions['source']): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source }).assets);\n }\n return assets;\n}\n\nfunction sourceMode(options: AssetLedgerIndexOptions): AssetLedgerIndexSourceMode {\n if (!options.source || options.source === 'all') return 'all';\n if (options.source === 'catalog' || options.source === 'local') return options.source;\n throw new Error(`Unknown ledger source mode: ${options.source}`);\n}\n\nfunction assetsForIndex(project: string, mode: AssetLedgerIndexSourceMode): GrowthAsset[] {\n if (mode === 'catalog') return allAssets(project, 'catalog');\n if (mode === 'local') return allAssets(project, 'local');\n return [...allAssets(project, 'catalog'), ...allAssets(project, 'local')];\n}\n\nfunction recordId(project: string, asset: GrowthAsset): string {\n const checksum = asset.local?.checksum_sha256 || asset.s3?.checksum_sha256;\n return checksum ? `${project}:sha256:${checksum}` : `${project}:asset:${asset.asset_id}`;\n}\n\nfunction sourceId(project: string, record: string, sourceType: AssetLedgerSourceType, key: string): string {\n return `${project}:${record}:${sourceType}:${key}`;\n}\n\nfunction upsertProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, `${repoRoot}/${project}/assets/catalog.json`, timestamp, timestamp);\n}\n\nexport function upsertAssetLedgerAsset(database: DatabaseSync, project: string, asset: GrowthAsset, context: IndexContext = {}): void {\n const timestamp = context.seenAt || nowIso();\n const id = recordId(project, asset);\n const checksum = asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null;\n upsertLedgerWorkflowAsset(database, project, asset, timestamp);\n database.prepare(`\n insert into asset_ledger_records (\n id, project_id, canonical_asset_id, checksum_sha256, media_type, title, status,\n channel, campaign, audience, created_at, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n canonical_asset_id = excluded.canonical_asset_id,\n checksum_sha256 = coalesce(asset_ledger_records.checksum_sha256, excluded.checksum_sha256),\n media_type = excluded.media_type,\n title = excluded.title,\n status = excluded.status,\n channel = excluded.channel,\n campaign = excluded.campaign,\n audience = excluded.audience,\n updated_at = excluded.updated_at,\n first_seen_at = coalesce(asset_ledger_records.first_seen_at, excluded.first_seen_at),\n last_seen_at = excluded.last_seen_at,\n indexed_by_run_id = excluded.indexed_by_run_id\n `).run(\n id, project, asset.asset_id, checksum, asset.content_type, asset.title, asset.status,\n asset.channel || null, asset.campaign || null, asset.audience || null,\n timestamp, timestamp, timestamp, timestamp, context.runId || null\n );\n if (asset.source !== 'local') upsertSource(database, project, id, 'catalog', asset, asset.asset_id, context);\n if (asset.local) upsertSource(database, project, id, 'local', asset, asset.local.relative_path, context);\n if (asset.s3) upsertSource(database, project, id, 's3', asset, asset.s3.key, context);\n upsertLedgerPlacementsForAsset(database, project, asset);\n}\n\nfunction upsertSource(\n database: DatabaseSync,\n project: string,\n record: string,\n sourceType: AssetLedgerSourceType,\n asset: GrowthAsset,\n key: string,\n context: IndexContext = {}\n): void {\n const timestamp = context.seenAt || nowIso();\n const id = sourceId(project, record, sourceType, key);\n database.prepare(`\n insert into asset_ledger_sources (\n id, project_id, record_id, source_type, asset_id, local_path, s3_bucket, s3_region,\n s3_key, s3_version_id, etag, size_bytes, content_type, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n asset_id = excluded.asset_id,\n local_path = excluded.local_path,\n s3_bucket = excluded.s3_bucket,\n s3_region = excluded.s3_region,\n s3_key = excluded.s3_key,\n s3_version_id = excluded.s3_version_id,\n etag = excluded.etag,\n size_bytes = excluded.size_bytes,\n content_type = excluded.content_type,\n updated_at = excluded.updated_at,\n first_seen_at = coalesce(asset_ledger_sources.first_seen_at, excluded.first_seen_at),\n last_seen_at = excluded.last_seen_at,\n indexed_by_run_id = excluded.indexed_by_run_id\n `).run(\n id, project, record, sourceType, asset.asset_id,\n sourceType === 'local' ? asset.local?.relative_path || null : null,\n sourceType === 's3' ? asset.s3?.bucket || null : null,\n sourceType === 's3' ? asset.s3?.region || null : null,\n sourceType === 's3' ? asset.s3?.key || null : null,\n sourceType === 's3' ? asset.s3?.version_id || null : null,\n sourceType === 's3' ? asset.s3?.etag || null : null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null,\n asset.local?.content_type || asset.s3?.content_type || null,\n asset.local?.updated_at || asset.s3?.updated_at || null,\n timestamp, timestamp, context.runId || null\n );\n}\n\nexport function indexAssetLedger(project = defaultProject, options: AssetLedgerIndexOptions = {}): AssetLedgerIndexSummary {\n const mode = sourceMode(options);\n const database = lineageDb();\n const startedAt = nowIso();\n upsertProject(database, project);\n const runId = createIndexRun(database, project, mode, startedAt);\n try {\n const assets = assetsForIndex(project, mode);\n for (const asset of assets) upsertAssetLedgerAsset(database, project, asset, { runId, seenAt: startedAt });\n const summary = ledgerSummary(database, project, assets.length, mode);\n completeIndexRun(database, runId, summary, null);\n const run = latestIndexRun(database, project) as AssetLedgerIndexRun;\n database.close();\n return { ...summary, run };\n } catch (error) {\n completeIndexRun(database, runId, ledgerSummary(database, project, 0, mode), error instanceof Error ? error.message : String(error));\n database.close();\n throw error;\n }\n}\n\nfunction ledgerSummary(database: DatabaseSync, project: string, assetsIndexed: number, mode: AssetLedgerIndexSourceMode): Omit<AssetLedgerIndexSummary, 'run'> {\n const sources = sourceCounts(database, project);\n const recordRow = database.prepare('select count(*) count from asset_ledger_records where project_id = ?').get(project) as { count: number };\n return {\n project,\n database: lineageDbPath(),\n records: Number(recordRow.count),\n assets_indexed: assetsIndexed,\n source_mode: mode,\n include_live_s3: false,\n sources,\n fetchedAt: nowIso(),\n };\n}\n\nfunction createIndexRun(database: DatabaseSync, project: string, mode: AssetLedgerIndexSourceMode, startedAt: string): string {\n const id = `${project}:ledger-run:${startedAt}`;\n database.prepare(`\n insert into asset_ledger_index_runs (id, project_id, source_mode, include_live_s3, status, started_at)\n values (?, ?, ?, 0, 'running', ?)\n `).run(id, project, mode, startedAt);\n return id;\n}\n\nfunction completeIndexRun(\n database: DatabaseSync,\n runId: string,\n summary: Omit<AssetLedgerIndexSummary, 'run'>,\n error: string | null\n): void {\n database.prepare(`\n update asset_ledger_index_runs\n set status = ?, completed_at = ?, assets_indexed = ?, records_after = ?,\n catalog_sources_after = ?, local_sources_after = ?, s3_sources_after = ?, error = ?\n where id = ?\n `).run(\n error ? 'failed' : 'complete',\n nowIso(),\n summary.assets_indexed,\n summary.records,\n summary.sources.catalog,\n summary.sources.local,\n summary.sources.s3,\n error,\n runId\n );\n}\n\nfunction sourceCounts(database: DatabaseSync, project: string): Record<AssetLedgerSourceType, number> {\n const rows = database.prepare(`\n select source_type, count(*) count\n from asset_ledger_sources\n where project_id = ?\n group by source_type\n `).all(project) as Array<{ source_type: AssetLedgerSourceType; count: number }>;\n return {\n catalog: Number(rows.find(row => row.source_type === 'catalog')?.count || 0),\n local: Number(rows.find(row => row.source_type === 'local')?.count || 0),\n s3: Number(rows.find(row => row.source_type === 's3')?.count || 0),\n };\n}\n\nexport function getAssetLedgerSnapshot(project = defaultProject): AssetLedgerSnapshot {\n const database = lineageDb();\n const records = database.prepare(`\n select id, project_id, canonical_asset_id, checksum_sha256, media_type, title, status, channel,\n campaign, audience, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n from asset_ledger_records\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as unknown as LedgerRecordRow[];\n const sources = database.prepare(`\n select id, record_id, source_type, asset_id, local_path, s3_bucket, s3_region, s3_key,\n s3_version_id, etag, size_bytes, content_type, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n from asset_ledger_sources\n where project_id = ?\n order by source_type, id\n `).all(project) as unknown as LedgerSourceRow[];\n const totals = sourceCounts(database, project);\n const lastIndexRun = latestIndexRun(database, project);\n const sourceRecords = sources.map(toSource);\n const baseRecords = records.map(record => toRecord(record, sourceRecords.filter(source => source.record_id === record.id)));\n const workflows = ledgerWorkflowStates(database, project, baseRecords, sourceRecords);\n database.close();\n return {\n project,\n database: lineageDbPath(),\n records: baseRecords.map(record => ({ ...record, workflow: workflows[record.id] || { placements: [] } })),\n last_index_run: lastIndexRun,\n totals: {\n records: records.length,\n local: totals.local,\n catalog: totals.catalog,\n s3: totals.s3,\n },\n fetchedAt: nowIso(),\n };\n}\n\nfunction latestIndexRun(database: DatabaseSync, project: string): AssetLedgerIndexRun | undefined {\n const row = database.prepare(`\n select id, project_id, source_mode, include_live_s3, status, started_at, completed_at,\n assets_indexed, records_after, catalog_sources_after, local_sources_after, s3_sources_after, error\n from asset_ledger_index_runs\n where project_id = ?\n order by started_at desc, id desc\n limit 1\n `).get(project) as LedgerRunRow | undefined;\n return row ? toIndexRun(row) : undefined;\n}\n\nfunction toIndexRun(row: LedgerRunRow): AssetLedgerIndexRun {\n return {\n id: row.id,\n project: row.project_id,\n source_mode: row.source_mode,\n include_live_s3: Boolean(row.include_live_s3),\n status: row.status,\n started_at: row.started_at,\n completed_at: row.completed_at || undefined,\n assets_indexed: Number(row.assets_indexed),\n records_after: Number(row.records_after),\n sources_after: {\n catalog: Number(row.catalog_sources_after),\n local: Number(row.local_sources_after),\n s3: Number(row.s3_sources_after),\n },\n error: row.error || undefined,\n };\n}\n\nfunction toRecord(record: LedgerRecordRow, sources: AssetLedgerSource[]): AssetLedgerRecord {\n return {\n id: record.id,\n project: record.project_id,\n canonical_asset_id: record.canonical_asset_id,\n checksum_sha256: record.checksum_sha256 || undefined,\n media_type: record.media_type,\n title: record.title,\n status: record.status,\n channel: record.channel || undefined,\n campaign: record.campaign || undefined,\n audience: record.audience || undefined,\n updated_at: record.updated_at,\n first_seen_at: record.first_seen_at || undefined,\n last_seen_at: record.last_seen_at,\n indexed_by_run_id: record.indexed_by_run_id || undefined,\n sources,\n workflow: { placements: [] },\n };\n}\n\nfunction toSource(source: LedgerSourceRow): AssetLedgerSource {\n return {\n id: source.id,\n record_id: source.record_id,\n source_type: source.source_type,\n asset_id: source.asset_id || undefined,\n local_path: source.local_path || undefined,\n s3_bucket: source.s3_bucket || undefined,\n s3_region: source.s3_region || undefined,\n s3_key: source.s3_key || undefined,\n s3_version_id: source.s3_version_id || undefined,\n etag: source.etag || undefined,\n size_bytes: source.size_bytes || undefined,\n content_type: source.content_type || undefined,\n updated_at: source.updated_at || undefined,\n first_seen_at: source.first_seen_at || undefined,\n last_seen_at: source.last_seen_at,\n indexed_by_run_id: source.indexed_by_run_id || undefined,\n };\n}\n", "import { getAssetLedgerSnapshot, indexAssetLedger } from './assetLedger';\nimport type { AssetLedgerIndexSourceMode, AssetLedgerRecord, AssetReviewState, PlacementStatus } from '../shared/types';\n\nexport type LedgerStorageFilter = 'all' | 'local-only' | 's3-backed' | 'local-and-s3' | 'catalog-only';\nexport type LedgerReviewFilter = 'all' | AssetReviewState;\nexport type LedgerPlacementFilter = 'all' | PlacementStatus | 'not-posted' | 'not-scheduled';\nexport type LedgerSelectionFilter = 'all' | 'selected' | 'not-selected';\n\nexport interface LedgerPageOptions {\n page?: number;\n pageSize?: number;\n placement?: LedgerPlacementFilter;\n query?: string;\n refresh?: boolean;\n review?: LedgerReviewFilter;\n selection?: LedgerSelectionFilter;\n source?: AssetLedgerIndexSourceMode;\n storage?: LedgerStorageFilter;\n}\n\nconst storageFilters = new Set<LedgerStorageFilter>(['all', 'local-only', 's3-backed', 'local-and-s3', 'catalog-only']);\nconst reviewFilters = new Set<LedgerReviewFilter>(['all', 'unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\nconst placementFilters = new Set<LedgerPlacementFilter>(['all', 'planned', 'scheduled', 'posted', 'skipped', 'not-posted', 'not-scheduled']);\nconst selectionFilters = new Set<LedgerSelectionFilter>(['all', 'selected', 'not-selected']);\n\nfunction normalizeFilter<T extends string>(value: unknown, allowed: Set<T>, fallback: T): T {\n return typeof value === 'string' && allowed.has(value as T) ? value as T : fallback;\n}\n\nfunction sourceTypes(record: AssetLedgerRecord) {\n return new Set(record.sources.map(source => source.source_type));\n}\n\nfunction matchesStorage(record: AssetLedgerRecord, storage: LedgerStorageFilter): boolean {\n const types = sourceTypes(record);\n if (storage === 'local-only') return types.has('local') && !types.has('s3');\n if (storage === 's3-backed') return types.has('s3');\n if (storage === 'local-and-s3') return types.has('local') && types.has('s3');\n if (storage === 'catalog-only') return types.has('catalog') && !types.has('local') && !types.has('s3');\n return true;\n}\n\nfunction matchesPlacement(record: AssetLedgerRecord, placement: LedgerPlacementFilter): boolean {\n if (placement === 'not-scheduled') return record.workflow.placements.length === 0;\n if (placement === 'not-posted') return !record.workflow.placements.some(item => item.status === 'posted');\n if (placement === 'all') return true;\n return record.workflow.placements.some(item => item.status === placement);\n}\n\nfunction matchesSelection(record: AssetLedgerRecord, selection: LedgerSelectionFilter): boolean {\n if (selection === 'selected') return Boolean(record.workflow.selection);\n if (selection === 'not-selected') return !record.workflow.selection;\n return true;\n}\n\nfunction filterLedgerRecords(records: AssetLedgerRecord[], options: LedgerPageOptions = {}) {\n const placement = normalizeFilter(options.placement, placementFilters, 'all');\n const review = normalizeFilter(options.review, reviewFilters, 'all');\n const selection = normalizeFilter(options.selection, selectionFilters, 'all');\n const storage = normalizeFilter(options.storage, storageFilters, 'all');\n const query = options.query?.trim().toLowerCase() || '';\n return records.filter(record => {\n if (!matchesStorage(record, storage)) return false;\n if (review !== 'all' && (record.workflow.review?.review_state || 'unreviewed') !== review) return false;\n if (!matchesPlacement(record, placement)) return false;\n if (!matchesSelection(record, selection)) return false;\n if (!query) return true;\n return [\n record.canonical_asset_id,\n record.title,\n record.status,\n record.channel,\n record.campaign,\n record.audience,\n record.workflow.review?.review_state,\n ...record.workflow.placements.map(item => `${item.channel} ${item.status}`),\n ].join(' ').toLowerCase().includes(query);\n });\n}\n\nexport function getLedgerPage(project: string, options: LedgerPageOptions = {}) {\n const pageSize = Math.min(Math.max(Number(options.pageSize || 25), 1), 100);\n const page = Math.max(Number(options.page || 1), 1);\n const indexSummary = options.refresh ? indexAssetLedger(project, { source: options.source || 'all' }) : undefined;\n const snapshot = getAssetLedgerSnapshot(project);\n const records = filterLedgerRecords(snapshot.records, options);\n const totalPages = Math.max(Math.ceil(records.length / pageSize), 1);\n const safePage = Math.min(page, totalPages);\n const start = (safePage - 1) * pageSize;\n return {\n ...snapshot,\n records: records.slice(start, start + pageSize),\n index_summary: indexSummary,\n pagination: { page: safePage, pageSize, total: records.length, totalPages },\n };\n}\n\nexport function getLedgerPageFromQuery(project: string, query: Record<string, unknown>) {\n return getLedgerPage(project, {\n page: Number(query.page || 1),\n pageSize: Number(query.pageSize || 25),\n placement: normalizeFilter(query.placement, placementFilters, 'all'),\n query: typeof query.q === 'string' ? query.q : undefined,\n refresh: query.refresh === 'true',\n review: normalizeFilter(query.review, reviewFilters, 'all'),\n selection: normalizeFilter(query.selection, selectionFilters, 'all'),\n source: typeof query.source === 'string' ? query.source as AssetLedgerIndexSourceMode : 'all',\n storage: normalizeFilter(query.storage, storageFilters, 'all'),\n });\n}\n", "import type { SQLOutputValue } from 'node:sqlite';\nimport { indexLineageAssets, updateAssetReview } from './assetLineage';\nimport { lineageDb } from './assetLineageDb';\nimport { listAssets } from './assetCore';\nimport type { AssetLibrarySnapshot, AssetReviewState, BatchReviewFields, BatchReviewResponse, GrowthAsset, ReviewFields } from '../shared/types';\n\nexport interface AssetReviewSummary {\n asset_id: string;\n review_state: AssetReviewState;\n reviewed_at?: string;\n ignored_at?: string;\n notes?: string;\n updated_at: string;\n}\n\ninterface AssetReviewDbRow {\n asset_id: string;\n review_state: AssetReviewState;\n reviewed_at: string | null;\n ignored_at: string | null;\n notes: string | null;\n updated_at: string;\n}\n\nconst reviewStates = new Set<AssetReviewState>(['unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\n\nclass AssetReviewError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetReviewError(error: unknown): error is AssetReviewError {\n return error instanceof AssetReviewError;\n}\n\nfunction stringColumn(row: Record<string, SQLOutputValue>, column: keyof AssetReviewDbRow): string {\n const value = row[column];\n if (typeof value !== 'string') throw new TypeError(`Invalid asset review row column: ${column}`);\n return value;\n}\n\nfunction nullableStringColumn(row: Record<string, SQLOutputValue>, column: keyof AssetReviewDbRow): string | null {\n const value = row[column];\n if (value === null || typeof value === 'string') return value;\n throw new TypeError(`Invalid asset review row column: ${column}`);\n}\n\nfunction toAssetReviewDbRow(row: Record<string, SQLOutputValue>): AssetReviewDbRow {\n const reviewState = stringColumn(row, 'review_state');\n if (!reviewStates.has(reviewState as AssetReviewState)) throw new TypeError(`Invalid asset review state: ${reviewState}`);\n return {\n asset_id: stringColumn(row, 'asset_id'),\n review_state: reviewState as AssetReviewState,\n reviewed_at: nullableStringColumn(row, 'reviewed_at'),\n ignored_at: nullableStringColumn(row, 'ignored_at'),\n notes: nullableStringColumn(row, 'notes'),\n updated_at: stringColumn(row, 'updated_at'),\n };\n}\n\nfunction toAssetReviewSummary(row: AssetReviewDbRow): AssetReviewSummary {\n return {\n asset_id: row.asset_id,\n review_state: row.review_state,\n reviewed_at: row.reviewed_at ?? undefined,\n ignored_at: row.ignored_at ?? undefined,\n notes: row.notes ?? undefined,\n updated_at: row.updated_at,\n };\n}\n\nexport function getAssetReviewMap(project: string, assetIds: string[]): Record<string, AssetReviewSummary> {\n if (assetIds.length === 0) return {};\n indexLineageAssets(project);\n const database = lineageDb();\n try {\n const placeholders = assetIds.map(() => '?').join(',');\n const rows = database.prepare(`\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews\n where asset_id in (${placeholders})\n `).all(...assetIds).map(toAssetReviewDbRow);\n return Object.fromEntries(rows.map(row => [row.asset_id, toAssetReviewSummary(row)]));\n } finally {\n database.close();\n }\n}\n\nexport function markAssetReview(project: string, fields: ReviewFields) {\n indexLineageAssets(project);\n return updateAssetReview(project, fields);\n}\n\nfunction localAssetIds(project: string): Set<string> {\n return new Set(localAssets(project).map(asset => asset.asset_id));\n}\n\nfunction localAssets(project: string): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source: 'local' });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source: 'local' }).assets);\n }\n return assets;\n}\n\nfunction uniqueAssetIds(assetIds: string[]): string[] {\n const ids = assetIds.map(assetId => assetId.trim()).filter(Boolean);\n return [...new Set(ids)];\n}\n\nexport function markAssetReviews(project: string, fields: BatchReviewFields): BatchReviewResponse {\n if (!reviewStates.has(fields.reviewState)) throw new AssetReviewError(`Unsupported local review state: ${fields.reviewState}`);\n const assetIds = uniqueAssetIds(fields.assetIds);\n if (assetIds.length < 1) throw new AssetReviewError('Batch local review requires at least one asset id');\n const knownLocalIds = localAssetIds(project);\n const unknownIds = assetIds.filter(assetId => !knownLocalIds.has(assetId));\n if (unknownIds.length > 0) throw new AssetReviewError(`Unknown local asset${unknownIds.length === 1 ? '' : 's'}: ${unknownIds.join(', ')}`, 404);\n\n if (!fields.confirmWrite) {\n const results = assetIds.map(assetId => ({\n asset_id: assetId,\n dryRun: true as const,\n notes: fields.notes,\n review_state: fields.reviewState,\n }));\n return {\n ok: true,\n dryRun: true,\n message: `Would mark ${assetIds.length} local asset${assetIds.length === 1 ? '' : 's'} ${fields.reviewState}`,\n review_state: fields.reviewState,\n notes: fields.notes,\n count: results.length,\n results,\n };\n }\n\n indexLineageAssets(project);\n const results = assetIds.map(assetId => {\n const result = updateAssetReview(project, {\n assetId,\n confirmWrite: true,\n notes: fields.notes,\n reviewState: fields.reviewState,\n });\n return {\n asset_id: result.asset_id,\n message: result.message,\n notes: fields.notes,\n review_state: result.review_state,\n };\n });\n return {\n ok: true,\n message: `Marked ${results.length} local asset${results.length === 1 ? '' : 's'} ${fields.reviewState}`,\n review_state: fields.reviewState,\n notes: fields.notes,\n count: results.length,\n results,\n };\n}\n\nfunction normalizeReviewState(value: unknown): AssetReviewState {\n const rawState = typeof value === 'string' ? value : 'unreviewed';\n return rawState.replace(/-/g, '_') as AssetReviewState;\n}\n\nfunction batchReviewFieldsFromRequestBody(body: Record<string, unknown>): BatchReviewFields {\n if (!Array.isArray(body.assetIds)) throw new AssetReviewError('Batch local review requires assetIds array');\n const badAssetId = body.assetIds.find(assetId => typeof assetId !== 'string');\n if (badAssetId !== undefined) throw new AssetReviewError('Batch local review assetIds must be strings');\n return {\n assetIds: body.assetIds,\n reviewState: normalizeReviewState(body.reviewState || body.state),\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n confirmWrite: body.confirmWrite === true && body.dryRun !== true,\n };\n}\n\nexport function markAssetReviewsFromRequestBody(project: string, body: Record<string, unknown>): BatchReviewResponse {\n return markAssetReviews(project, batchReviewFieldsFromRequestBody(body));\n}\n\nexport function requireApprovedLocalBackup(project: string, asset: GrowthAsset): AssetReviewSummary {\n if (!asset.local?.relative_path) throw new AssetReviewError(`Asset is not local-only: ${asset.asset_id}`);\n const review = getAssetReviewMap(project, [asset.asset_id])[asset.asset_id];\n if (review?.review_state !== 'approved') throw new AssetReviewError(`Local backup requires approved local review for ${asset.asset_id}`, 403);\n return review;\n}\n\nexport function requireApprovedLocalBackupPath(project: string, relativePath: string): GrowthAsset {\n const asset = localAssets(project).find(item => item.local?.relative_path === relativePath);\n if (!asset) throw new AssetReviewError(`Unknown local asset path: ${relativePath}`, 404);\n requireApprovedLocalBackup(project, asset);\n return asset;\n}\n\nexport function withLocalReviewMetadata(project: string, snapshot: AssetLibrarySnapshot): AssetLibrarySnapshot {\n const localAssetIds = snapshot.assets.filter(asset => asset.local?.relative_path).map(asset => asset.asset_id);\n const reviewMap = getAssetReviewMap(project, localAssetIds);\n return {\n ...snapshot,\n assets: snapshot.assets.map(asset => {\n const review = reviewMap[asset.asset_id];\n if (!asset.local?.relative_path || !review) return asset;\n return { ...asset, review: { notes: review.notes, review_state: review.review_state, updated_at: review.updated_at } };\n }),\n };\n}\n", "import { defaultProject, listAssets } from './assetCore';\nimport { getAssetReviewMap } from './assetReviews';\nimport type { GrowthAsset, ListAssetsOptions, ReviewQueueLane, ReviewQueueSnapshot, ReviewableAsset } from '../shared/types';\n\ninterface QueueOptions {\n channel?: string;\n limit?: number;\n}\n\nfunction allAssets(project: string, source: ListAssetsOptions['source']): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source }).assets);\n }\n return assets;\n}\n\nfunction isPosted(asset: GrowthAsset): boolean {\n return Boolean(asset.placements?.some(placement => placement.status === 'posted'));\n}\n\nfunction isScheduled(asset: GrowthAsset): boolean {\n return Boolean(asset.placements?.some(placement => placement.status === 'scheduled'));\n}\n\nfunction isReadyToPost(asset: GrowthAsset): boolean {\n return asset.status !== 'archived' && Boolean(asset.s3?.key) && !isPosted(asset) && !isScheduled(asset);\n}\n\nfunction withReviews(project: string, assets: GrowthAsset[]): ReviewableAsset[] {\n const reviewMap = getAssetReviewMap(project, assets.map(asset => asset.asset_id));\n return assets.map(asset => ({\n ...asset,\n review: reviewMap[asset.asset_id]\n ? {\n notes: reviewMap[asset.asset_id].notes,\n review_state: reviewMap[asset.asset_id].review_state,\n updated_at: reviewMap[asset.asset_id].updated_at,\n }\n : { review_state: 'unreviewed' },\n }));\n}\n\nfunction reviewState(asset: ReviewableAsset) {\n return asset.review?.review_state || 'unreviewed';\n}\n\nfunction laneFor(channel: string, localAssets: ReviewableAsset[], catalogAssets: GrowthAsset[], limit: number): ReviewQueueLane {\n const reviewedLocal = localAssets.filter(asset => asset.channel === channel);\n const needsQa = reviewedLocal.filter(asset => reviewState(asset) === 'unreviewed');\n const approvedLocal = reviewedLocal.filter(asset => reviewState(asset) === 'approved');\n const needsRevision = reviewedLocal.filter(asset => reviewState(asset) === 'needs_revision');\n const rejectedLocal = reviewedLocal.filter(asset => reviewState(asset) === 'rejected' || reviewState(asset) === 'ignored');\n const readyToPost = catalogAssets.filter(asset => asset.channel === channel && isReadyToPost(asset));\n const scheduled = catalogAssets.filter(asset => asset.channel === channel && isScheduled(asset) && !isPosted(asset));\n const posted = catalogAssets.filter(asset => asset.channel === channel && isPosted(asset));\n return {\n approvedLocal: approvedLocal.slice(0, limit),\n channel,\n needsQa: needsQa.slice(0, limit),\n needsRevision: needsRevision.slice(0, limit),\n posted: posted.slice(0, limit),\n readyToPost: readyToPost.slice(0, limit),\n rejectedLocal: rejectedLocal.slice(0, limit),\n scheduled: scheduled.slice(0, limit),\n totals: {\n approvedLocal: approvedLocal.length,\n needsQa: needsQa.length,\n needsRevision: needsRevision.length,\n posted: posted.length,\n readyToPost: readyToPost.length,\n rejectedLocal: rejectedLocal.length,\n scheduled: scheduled.length,\n },\n };\n}\n\nfunction handoff(project: string) {\n const prefix = `npx @mean-weasel/lineage`;\n return {\n backupTemplate: `${prefix} local backup --project ${project} --asset-id <local-id> --dry-run --json`,\n lineageNextTemplate: `${prefix} lineage next --project ${project} --root <root-id> --json`,\n localListCommand: `${prefix} local list --project ${project} --json`,\n queueCommand: `${prefix} review queue --project ${project} --json`,\n scheduleTemplate: `${prefix} placement mark-scheduled --project ${project} --asset-id <asset-id> --channel <channel> --scheduled-at <iso> --dry-run --json`,\n };\n}\n\nexport function getReviewQueue(project = defaultProject, options: QueueOptions = {}): ReviewQueueSnapshot {\n const limit = Math.min(Math.max(Number(options.limit || 6), 1), 24);\n const localAssets = allAssets(project, 'local');\n const catalogAssets = allAssets(project, 'catalog');\n const channels = Array.from(new Set([...localAssets, ...catalogAssets].map(asset => asset.channel)))\n .filter(channel => !options.channel || options.channel === 'all' || channel === options.channel)\n .sort();\n const channelSet = new Set(channels);\n const reviewedLocalAssets = withReviews(project, localAssets.filter(asset => channelSet.has(asset.channel)));\n const lanes = channels.map(channel => laneFor(channel, reviewedLocalAssets, catalogAssets, limit));\n return {\n fetchedAt: new Date().toISOString(),\n handoff: handoff(project),\n lanes,\n project,\n totals: {\n approvedLocal: lanes.reduce((sum, lane) => sum + lane.totals.approvedLocal, 0),\n channels: lanes.length,\n needsQa: lanes.reduce((sum, lane) => sum + lane.totals.needsQa, 0),\n needsRevision: lanes.reduce((sum, lane) => sum + lane.totals.needsRevision, 0),\n posted: lanes.reduce((sum, lane) => sum + lane.totals.posted, 0),\n readyToPost: lanes.reduce((sum, lane) => sum + lane.totals.readyToPost, 0),\n rejectedLocal: lanes.reduce((sum, lane) => sum + lane.totals.rejectedLocal, 0),\n scheduled: lanes.reduce((sum, lane) => sum + lane.totals.scheduled, 0),\n },\n };\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type { AssetSelectionActor, AssetSelectionItem, AssetSelectionItemRole, AssetSelectionSet } from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nexport class AssetReviewSetError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetReviewSetError(error: unknown): error is AssetReviewSetError {\n return error instanceof AssetReviewSetError;\n}\n\nfunction rowToItem(row: Row): AssetSelectionItem {\n return {\n id: String(row.id),\n set_id: String(row.set_id),\n asset_id: String(row.asset_id),\n role: String(row.role) as AssetSelectionItemRole,\n variation_label: typeof row.variation_label === 'string' ? row.variation_label : undefined,\n position: Number(row.position || 0),\n selected_by: typeof row.selected_by === 'string' ? row.selected_by as AssetSelectionActor : undefined,\n selected_at: typeof row.selected_at === 'string' ? row.selected_at : undefined,\n deselected_at: typeof row.deselected_at === 'string' ? row.deselected_at : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction itemsForSet(database: DatabaseSync, id: string): AssetSelectionItem[] {\n return (database.prepare(`\n select * from selection_items where set_id = ?\n order by position, variation_label, created_at, asset_id\n `).all(id) as Row[]).map(rowToItem);\n}\n\nfunction rowToSet(database: DatabaseSync, row: Row): AssetSelectionSet {\n const id = String(row.id);\n return {\n id,\n project: String(row.project_id),\n kind: 'review',\n key: String(row.key),\n label: String(row.label),\n status: row.status === 'archived' ? 'archived' : 'active',\n created_by: String(row.created_by) as AssetSelectionActor,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n items: itemsForSet(database, id),\n };\n}\n\nfunction reviewSet(database: DatabaseSync, project: string, setId: string): AssetSelectionSet {\n const row = database.prepare(`\n select * from selection_sets where id = ? and project_id = ? and kind = 'review'\n `).get(setId, project) as Row | undefined;\n if (!row) throw new AssetReviewSetError(`Unknown review set: ${setId}`, 404);\n return rowToSet(database, row);\n}\n\nexport function inspectReviewSet(project: string, setId: string): AssetSelectionSet {\n const database = lineageDb();\n try {\n return reviewSet(database, project, setId);\n } finally {\n database.close();\n }\n}\n\nexport function listReviewSets(project: string): AssetSelectionSet[] {\n const database = lineageDb();\n try {\n return (database.prepare(`\n select * from selection_sets where project_id = ? and kind = 'review'\n order by updated_at desc, created_at desc\n `).all(project) as Row[]).map(row => rowToSet(database, row));\n } finally {\n database.close();\n }\n}\n\nexport function archiveReviewSet(project: string, setId: string, confirmWrite: boolean) {\n const preview = { project, review_set: setId, status: 'archived' };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would archive review set ${setId}`, preview };\n const database = lineageDb();\n try {\n reviewSet(database, project, setId);\n database.prepare('update selection_sets set status = ?, updated_at = ? where id = ?').run('archived', nowIso(), setId);\n return { ok: true as const, message: `Archived review set ${setId}`, review_set: reviewSet(database, project, setId) };\n } finally {\n database.close();\n }\n}\n\nexport function activateReviewSet(project: string, setId: string, confirmWrite: boolean) {\n const preview = { project, review_set: setId, status: 'active' };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would activate review set ${setId}`, preview };\n const database = lineageDb();\n try {\n reviewSet(database, project, setId);\n const timestamp = nowIso();\n database.prepare(`\n update selection_sets set status = 'archived', updated_at = ?\n where project_id = ? and kind = 'review' and status = 'active' and id <> ?\n `).run(timestamp, project, setId);\n database.prepare('update selection_sets set status = ?, updated_at = ? where id = ?').run('active', timestamp, setId);\n return { ok: true as const, message: `Activated review set ${setId}`, review_set: reviewSet(database, project, setId) };\n } finally {\n database.close();\n }\n}\n", "import express from 'express';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { activateReviewSet, archiveReviewSet, inspectReviewSet } from './assetReviewSets';\nimport type {\n AssetSelectionActor,\n AssetSelectionItem,\n AssetSelectionItemRole,\n AssetSelectionSet,\n AssetSelectionSetKind,\n AssetSelectionSnapshot,\n} from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nconst actors = new Set<AssetSelectionActor>(['human', 'agent', 'system']);\n\nexport class AssetSelectionError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetSelectionError(error: unknown): error is AssetSelectionError {\n return error instanceof AssetSelectionError;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction requireText(value: string | undefined, label: string): string {\n const text = value?.trim();\n if (!text) throw new AssetSelectionError(`Selection ${label} is required`);\n return text;\n}\n\nfunction normalizeActor(value: string | undefined, fallback: AssetSelectionActor): AssetSelectionActor {\n const actor = (value || fallback) as AssetSelectionActor;\n if (!actors.has(actor)) throw new AssetSelectionError(`Unsupported selection actor: ${actor}`);\n return actor;\n}\n\nfunction slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 80) || 'review-set';\n}\n\nfunction setId(project: string, kind: AssetSelectionSetKind, key: string): string {\n return `${project}:${kind}:${key}`;\n}\n\nfunction itemId(selectionSetId: string, assetId: string): string {\n return `${selectionSetId}:asset:${assetId}`;\n}\n\nfunction variationLabel(index: number): string {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (index < alphabet.length) return alphabet[index];\n return `A${index - alphabet.length + 1}`;\n}\n\nfunction rowToItem(row: Row): AssetSelectionItem {\n return {\n id: String(row.id),\n set_id: String(row.set_id),\n asset_id: String(row.asset_id),\n role: String(row.role) as AssetSelectionItemRole,\n variation_label: typeof row.variation_label === 'string' ? row.variation_label : undefined,\n position: Number(row.position || 0),\n selected_by: typeof row.selected_by === 'string' ? row.selected_by as AssetSelectionActor : undefined,\n selected_at: typeof row.selected_at === 'string' ? row.selected_at : undefined,\n deselected_at: typeof row.deselected_at === 'string' ? row.deselected_at : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction itemsForSet(database: DatabaseSync, id: string): AssetSelectionItem[] {\n return (database.prepare(`\n select * from selection_items\n where set_id = ?\n order by position, variation_label, created_at, asset_id\n `).all(id) as Row[]).map(rowToItem);\n}\n\nfunction rowToSet(database: DatabaseSync, row: Row): AssetSelectionSet {\n const id = String(row.id);\n return {\n id,\n project: String(row.project_id),\n kind: String(row.kind) as AssetSelectionSetKind,\n key: String(row.key),\n label: String(row.label),\n status: row.status === 'archived' ? 'archived' : 'active',\n created_by: String(row.created_by) as AssetSelectionActor,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n items: itemsForSet(database, id),\n };\n}\n\nfunction getSetById(database: DatabaseSync, id: string): AssetSelectionSet | null {\n const row = database.prepare('select * from selection_sets where id = ?').get(id) as Row | undefined;\n return row ? rowToSet(database, row) : null;\n}\n\nfunction getCurrentSet(database: DatabaseSync, project: string): AssetSelectionSet {\n ensureSelectionSet(database, project, {\n createdBy: 'system',\n key: 'current',\n kind: 'current',\n label: 'Current selections',\n });\n const found = getSetById(database, setId(project, 'current', 'current'));\n if (!found) throw new AssetSelectionError(`Unable to create current selection set for ${project}`, 500);\n return found;\n}\n\nfunction ensureSelectionSet(database: DatabaseSync, project: string, fields: {\n createdBy: AssetSelectionActor;\n key: string;\n kind: AssetSelectionSetKind;\n label: string;\n}): string {\n ensureProject(database, project);\n const timestamp = nowIso();\n const id = setId(project, fields.kind, fields.key);\n database.prepare(`\n insert into selection_sets (id, project_id, kind, key, label, status, created_by, created_at, updated_at)\n values (?, ?, ?, ?, ?, 'active', ?, ?, ?)\n on conflict(project_id, kind, key) do update set\n label = excluded.label, status = 'active', updated_at = excluded.updated_at\n `).run(id, project, fields.kind, fields.key, fields.label, fields.createdBy, timestamp, timestamp);\n return id;\n}\n\nfunction replaceSetItems(database: DatabaseSync, id: string, items: Array<{\n assetId: string;\n notes?: string;\n position: number;\n role: AssetSelectionItemRole;\n selectedAt?: string;\n selectedBy?: AssetSelectionActor;\n variationLabel?: string;\n}>): void {\n database.prepare('delete from selection_items where set_id = ?').run(id);\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into selection_items (\n id, set_id, asset_id, role, variation_label, position, selected_by,\n selected_at, deselected_at, notes, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, null, ?, ?, ?)\n `);\n for (const item of items) {\n statement.run(\n itemId(id, item.assetId),\n id,\n item.assetId,\n item.role,\n item.variationLabel || null,\n item.position,\n item.selectedBy || null,\n item.selectedAt || null,\n item.notes || null,\n timestamp,\n timestamp,\n );\n }\n}\n\nexport function getAssetSelectionSnapshot(project: string): AssetSelectionSnapshot {\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n const reviewRows = database.prepare(`\n select * from selection_sets\n where project_id = ? and kind = 'review'\n order by updated_at desc, created_at desc\n `).all(project) as Row[];\n const reviewSets = reviewRows.map(row => rowToSet(database, row));\n return {\n project,\n fetchedAt: nowIso(),\n current,\n active_review_set: reviewSets.find(set => set.status === 'active') || null,\n review_sets: reviewSets,\n };\n } finally {\n database.close();\n }\n}\n\nexport function selectCurrentAssets(project: string, fields: {\n assetIds: string[];\n confirmWrite: boolean;\n notes?: string;\n selectedBy?: AssetSelectionActor;\n}) {\n const assetIds = [...new Set(fields.assetIds.map(assetId => assetId.trim()).filter(Boolean))];\n const actor = normalizeActor(fields.selectedBy, 'human');\n const preview = { assetIds, notes: fields.notes, project, selectedBy: actor };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would select ${assetIds.length} assets`, preview };\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n const selectedAt = nowIso();\n replaceSetItems(database, current.id, assetIds.map((assetId, index) => ({\n assetId,\n notes: fields.notes,\n position: index,\n role: 'primary',\n selectedAt,\n selectedBy: actor,\n })));\n database.prepare('update selection_sets set updated_at = ? where id = ?').run(selectedAt, current.id);\n return { ok: true as const, message: `Selected ${assetIds.length} assets`, selection: getSetById(database, current.id) };\n } finally {\n database.close();\n }\n}\n\nexport function clearCurrentSelection(project: string, confirmWrite: boolean) {\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: 'Would clear current asset selections' };\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n database.prepare('delete from selection_items where set_id = ?').run(current.id);\n database.prepare('update selection_sets set updated_at = ? where id = ?').run(nowIso(), current.id);\n return { ok: true as const, message: 'Cleared current asset selections', selection: getSetById(database, current.id) };\n } finally {\n database.close();\n }\n}\n\nexport function createReviewSet(project: string, fields: {\n assetIds?: string[];\n confirmWrite: boolean;\n createdBy?: AssetSelectionActor;\n key?: string;\n label: string;\n notes?: string;\n}) {\n const label = requireText(fields.label, 'review set label');\n const key = fields.key?.trim() || `${slug(label)}-${Date.now().toString(36)}`;\n const assetIds = [...new Set((fields.assetIds || []).map(assetId => assetId.trim()).filter(Boolean))];\n const actor = normalizeActor(fields.createdBy, 'agent');\n const preview = { assetIds, createdBy: actor, key, label, notes: fields.notes, project };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would create review set ${label}`, preview };\n const database = lineageDb();\n try {\n const id = ensureSelectionSet(database, project, { createdBy: actor, key, kind: 'review', label });\n replaceSetItems(database, id, assetIds.map((assetId, index) => ({\n assetId,\n notes: fields.notes,\n position: index,\n role: 'candidate',\n variationLabel: variationLabel(index),\n })));\n return { ok: true as const, message: `Saved review set ${label}`, review_set: getSetById(database, id) };\n } finally {\n database.close();\n }\n}\n\nfunction activeReviewSet(database: DatabaseSync, project: string, setId?: string): AssetSelectionSet {\n if (setId) {\n const found = getSetById(database, setId);\n if (found?.project === project && found.kind === 'review' && found.status === 'active') return found;\n throw new AssetSelectionError(`Unknown active review set: ${setId}`, 404);\n }\n const rows = database.prepare(`\n select * from selection_sets\n where project_id = ? and kind = 'review' and status = 'active'\n order by updated_at desc, created_at desc\n limit 2\n `).all(project) as Row[];\n if (rows.length === 0) throw new AssetSelectionError(`No active review set exists for ${project}`, 404);\n if (rows.length > 1) throw new AssetSelectionError(`Multiple active review sets exist for ${project}; pass --set-id`, 409);\n return rowToSet(database, rows[0]);\n}\n\nexport function chooseReviewSetLabels(project: string, fields: {\n confirmWrite: boolean;\n labels: string[];\n notes?: string;\n selectedBy?: AssetSelectionActor;\n setId?: string;\n}) {\n const labels = [...new Set(fields.labels.map(label => label.trim().toUpperCase()).filter(Boolean))];\n if (labels.length === 0) throw new AssetSelectionError('At least one variation label is required');\n const actor = normalizeActor(fields.selectedBy, 'human');\n const database = lineageDb();\n try {\n const reviewSet = activeReviewSet(database, project, fields.setId);\n const byLabel = new Map(reviewSet.items.filter(item => item.variation_label).map(item => [item.variation_label, item]));\n const missing = labels.filter(label => !byLabel.has(label));\n if (missing.length > 0) throw new AssetSelectionError(`Unknown variation labels for ${reviewSet.label}: ${missing.join(', ')}`, 404);\n const chosen = labels.map(label => byLabel.get(label)!);\n const selectedAt = nowIso();\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n message: `Would choose ${labels.join(', ')} from ${reviewSet.label}`,\n preview: { labels, project, review_set: reviewSet.id, selected_assets: chosen.map(item => item.asset_id), selectedBy: actor },\n };\n }\n database.prepare('update selection_items set selected_by = null, selected_at = null, deselected_at = ?, updated_at = ? where set_id = ?')\n .run(selectedAt, selectedAt, reviewSet.id);\n const choose = database.prepare(`\n update selection_items\n set selected_by = ?, selected_at = ?, deselected_at = null, notes = ?, updated_at = ?\n where set_id = ? and variation_label = ?\n `);\n for (const label of labels) choose.run(actor, selectedAt, fields.notes || null, selectedAt, reviewSet.id, label);\n const current = getCurrentSet(database, project);\n replaceSetItems(database, current.id, chosen.map((item, index) => ({\n assetId: item.asset_id,\n notes: fields.notes || item.notes,\n position: index,\n role: 'primary',\n selectedAt,\n selectedBy: actor,\n variationLabel: item.variation_label,\n })));\n database.prepare('update selection_sets set updated_at = ? where id in (?, ?)').run(selectedAt, reviewSet.id, current.id);\n return {\n ok: true as const,\n message: `Selected ${labels.join(', ')} from ${reviewSet.label}`,\n current: getSetById(database, current.id),\n review_set: getSetById(database, reviewSet.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function labelsFromPrompt(prompt: string): string[] {\n const normalized = prompt.toUpperCase();\n const explicit = [...normalized.matchAll(/\\bVARIATION\\s+([A-Z])\\b/g)].map(match => match[1]);\n const short = [...normalized.matchAll(/\\b([A-Z])\\b/g)]\n .map(match => match[1])\n .filter(label => !['A', 'I'].includes(label));\n return [...new Set([...explicit, ...short])];\n}\n\nexport function assetSelectionRouter(projectFrom: (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string) {\n const router = express.Router();\n const asyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void): express.RequestHandler =>\n (req, res, next) => { Promise.resolve(handler(req, res)).catch(next); };\n router.get('/', asyncRoute((req, res) => {\n res.json(getAssetSelectionSnapshot(projectFrom(req)));\n }));\n router.post('/current', asyncRoute((req, res) => {\n const ids = Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [String(req.body.assetId || '')];\n res.json(selectCurrentAssets(projectFrom(req), {\n assetIds: ids,\n confirmWrite: req.body.confirmWrite === true,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n selectedBy: req.body.selectedBy === 'agent' || req.body.selectedBy === 'system' ? req.body.selectedBy : 'human',\n }));\n }));\n router.post('/current/clear', asyncRoute((req, res) => {\n res.json(clearCurrentSelection(projectFrom(req), req.body.confirmWrite === true));\n }));\n router.post('/review-sets', asyncRoute((req, res) => {\n res.json(createReviewSet(projectFrom(req), {\n assetIds: Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [],\n confirmWrite: req.body.confirmWrite === true,\n createdBy: req.body.createdBy === 'human' || req.body.createdBy === 'system' ? req.body.createdBy : 'agent',\n key: typeof req.body.key === 'string' ? req.body.key : undefined,\n label: String(req.body.label || 'Agent review set'),\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n }));\n }));\n router.get('/review-sets/:setId', asyncRoute((req, res) => { res.json({ ok: true, project: projectFrom(req), review_set: inspectReviewSet(projectFrom(req), req.params.setId) }); }));\n router.post('/review-sets/archive', asyncRoute((req, res) => { res.json(archiveReviewSet(projectFrom(req), String(req.body.setId || ''), req.body.confirmWrite === true)); }));\n router.post('/review-sets/activate', asyncRoute((req, res) => { res.json(activateReviewSet(projectFrom(req), String(req.body.setId || ''), req.body.confirmWrite === true)); }));\n router.post('/review-sets/choose', asyncRoute((req, res) => {\n const labels = Array.isArray(req.body.labels) ? req.body.labels.map(String) : String(req.body.labels || '').split(',');\n res.json(chooseReviewSetLabels(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n labels,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n selectedBy: req.body.selectedBy === 'agent' || req.body.selectedBy === 'system' ? req.body.selectedBy : 'human',\n setId: typeof req.body.setId === 'string' ? req.body.setId : undefined,\n }));\n }));\n return router;\n}\n", "import type express from 'express';\nimport {\n AgentClaimError,\n createAgentClaim,\n heartbeatAgentClaim,\n inspectAgentClaim,\n listAgentClaims,\n parseClaimTtl,\n releaseAgentClaim,\n releaseStaleAgentClaim,\n revokeAgentClaim,\n transferAgentClaim,\n type AgentClaimScopeType,\n} from './agentClaims';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function claimTokenFromRequest(req: express.Request): string | undefined {\n const header = req.header('X-Lineage-Claim-Token');\n if (header) return header;\n return typeof req.body?.claimToken === 'string' ? req.body.claimToken : undefined;\n}\n\nfunction stringBody(req: express.Request, key: string): string | undefined {\n const value = (req.body as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction boolBody(req: express.Request, key: string): boolean {\n return (req.body as Record<string, unknown>)[key] === true;\n}\n\nexport function registerAgentClaimRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/agent-claims', asyncRoute((req, res) => {\n const project = typeof req.query.project === 'string' ? req.query.project : undefined;\n res.json(listAgentClaims(project));\n }));\n\n app.post('/api/agent-claims', asyncRoute((req, res) => {\n res.json(createAgentClaim({\n agentId: stringBody(req, 'agentId'),\n agentKind: stringBody(req, 'agentKind'),\n agentName: stringBody(req, 'agentName') || stringBody(req, 'agent_name') || '',\n channel: stringBody(req, 'channel'),\n force: boolBody(req, 'force'),\n metadata: typeof req.body.metadata === 'object' && req.body.metadata !== null ? req.body.metadata as Record<string, unknown> : undefined,\n project: projectFrom({ body: req.body as Record<string, unknown>, query: req.query }),\n reason: stringBody(req, 'reason'),\n scopeType: (stringBody(req, 'scopeType') || stringBody(req, 'scope_type') || '') as AgentClaimScopeType,\n targetId: stringBody(req, 'targetId') || stringBody(req, 'target_id') || '',\n targetTitle: stringBody(req, 'targetTitle') || stringBody(req, 'target_title'),\n threadId: stringBody(req, 'threadId') || stringBody(req, 'thread_id'),\n ttlSeconds: parseClaimTtl(stringBody(req, 'ttl')),\n }));\n }));\n\n app.get('/api/agent-claims/:claimId', asyncRoute((req, res) => {\n res.json(inspectAgentClaim(req.params.claimId, typeof req.query.project === 'string' ? req.query.project : undefined));\n }));\n\n app.post('/api/agent-claims/:claimId/heartbeat', asyncRoute((req, res) => {\n const claimToken = claimTokenFromRequest(req);\n if (!claimToken) throw new AgentClaimError('Heartbeat requires claimToken', 400, 'claim_token_required');\n res.json(heartbeatAgentClaim(claimToken, parseClaimTtl(stringBody(req, 'ttl'))));\n }));\n\n app.post('/api/agent-claims/:claimId/release', asyncRoute((req, res) => {\n const claimToken = claimTokenFromRequest(req);\n if (!claimToken) throw new AgentClaimError('Release requires claimToken', 400, 'claim_token_required');\n res.json(releaseAgentClaim(claimToken));\n }));\n\n app.post('/api/agent-claims/:claimId/release-stale', asyncRoute((req, res) => {\n res.json(releaseStaleAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n }));\n }));\n\n app.post('/api/agent-claims/:claimId/revoke', asyncRoute((req, res) => {\n res.json(revokeAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n }));\n }));\n\n app.post('/api/agent-claims/:claimId/transfer', asyncRoute((req, res) => {\n res.json(transferAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n toAgentName: stringBody(req, 'toAgentName') || stringBody(req, 'to_agent_name') || '',\n }));\n }));\n}\n", "import { defaultProject, listProjects } from '../assetCore';\nimport { lineageDb, nowIso, type DatabaseSync } from '../assetLineageDb';\nimport type { AdapterProvider, AdapterSetting, AdapterSettingsSnapshot, AdapterType } from '../../shared/adapterSettingsTypes';\n\ninterface AdapterDefinition {\n adapter_type: AdapterType;\n default_enabled: boolean;\n description: string;\n label: string;\n provider: AdapterProvider;\n safeConfig(project: string): Record<string, unknown>;\n secret_ref: string | null;\n}\n\ninterface AdapterSettingRow {\n adapter_type: AdapterType;\n enabled: number;\n provider: AdapterProvider;\n safe_config_json: string;\n secret_ref: string | null;\n updated_at: string;\n}\n\nexport interface UpdateAdapterSettingFields {\n adapterType: AdapterType;\n confirmWrite: boolean;\n enabled: boolean;\n provider: AdapterProvider;\n safeConfig?: Record<string, unknown>;\n}\n\nexport class AdapterSettingsError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAdapterSettingsError(error: unknown): error is AdapterSettingsError {\n return error instanceof AdapterSettingsError;\n}\n\nconst definitions: AdapterDefinition[] = [\n {\n adapter_type: 'cloud',\n default_enabled: false,\n description: 'Optional cloud storage inspection for projects that configure it explicitly.',\n label: 'Cloud storage',\n provider: 's3',\n safeConfig: project => {\n if (project === defaultProject) return { bucket: '', mode: 'local-public-fallback', region: '' };\n const summary = listProjects().find(item => item.project === project);\n return { bucket: summary?.default_bucket || '', region: summary?.default_region || '' };\n },\n secret_ref: null,\n },\n {\n adapter_type: 'scheduler',\n default_enabled: false,\n description: 'Prepare reviewed social posts for external scheduling.',\n label: 'Buffer',\n provider: 'buffer',\n safeConfig: () => ({ defaultMode: 'dry-run' }),\n secret_ref: 'env:LINEAGE_SCHEDULER_TOKEN',\n },\n {\n adapter_type: 'image_generator',\n default_enabled: true,\n description: 'Create generation handoff packets and store proof receipts.',\n label: 'Codex handoff',\n provider: 'codex-handoff',\n safeConfig: () => ({ clearSelectionAfterImport: true, defaultVariationCount: 3, receipts: 'sqlite' }),\n secret_ref: null,\n },\n];\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction definitionFor(adapterType: AdapterType, provider: AdapterProvider): AdapterDefinition {\n const definition = definitions.find(item => item.adapter_type === adapterType && item.provider === provider);\n if (!definition) throw new AdapterSettingsError(`Unsupported adapter setting: ${adapterType}/${provider}`, 404);\n return definition;\n}\n\nfunction seedDefaults(database: DatabaseSync, project: string): void {\n ensureProject(database, project);\n const timestamp = nowIso();\n for (const definition of definitions) {\n database.prepare(`\n insert into adapter_settings (\n project_id, adapter_type, provider, enabled, secret_ref, safe_config_json, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, adapter_type, provider) do nothing\n `).run(\n project,\n definition.adapter_type,\n definition.provider,\n definition.default_enabled ? 1 : 0,\n definition.secret_ref,\n JSON.stringify(definition.safeConfig(project)),\n timestamp,\n timestamp\n );\n }\n}\n\nfunction parseConfig(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : {};\n } catch {\n return {};\n }\n}\n\nfunction credentialFor(provider: AdapterProvider, env: NodeJS.ProcessEnv) {\n if (provider === 's3') {\n return { detected: false, label: 'Optional local cloud CLI credential', secret_ref: null };\n }\n if (provider === 'buffer') {\n const detected = Boolean(env.LINEAGE_SCHEDULER_TOKEN && env.LINEAGE_SCHEDULER_ORGANIZATION_ID);\n return { detected, label: 'LINEAGE_SCHEDULER_TOKEN + LINEAGE_SCHEDULER_ORGANIZATION_ID', secret_ref: 'env:LINEAGE_SCHEDULER_TOKEN' };\n }\n return { detected: true, label: 'No external secret required', secret_ref: null };\n}\n\nfunction healthStatus(provider: AdapterProvider, enabled: boolean, config: Record<string, unknown>, credential: ReturnType<typeof credentialFor>) {\n if (provider === 's3') {\n if (!enabled) return 'live_disabled';\n return config.bucket && config.region ? 'not_tested' : 'missing_config';\n }\n if (provider === 'buffer') {\n if (!enabled) return 'live_disabled';\n return credential.detected ? 'configured' : 'dry_run_available';\n }\n if (!enabled) return 'disabled';\n return credential.detected ? 'configured' : 'missing_config';\n}\n\nfunction settingFromRow(row: AdapterSettingRow, env: NodeJS.ProcessEnv): AdapterSetting {\n const definition = definitionFor(row.adapter_type, row.provider);\n const credential = credentialFor(row.provider, env);\n const enabled = row.enabled === 1;\n const safeConfig = parseConfig(row.safe_config_json);\n return {\n adapter_type: row.adapter_type,\n credential,\n description: definition.description,\n enabled,\n health_status: healthStatus(row.provider, enabled, safeConfig, credential),\n label: definition.label,\n provider: row.provider,\n safe_config: safeConfig,\n updated_at: row.updated_at,\n };\n}\n\nfunction rejectSecretLikeConfig(config: Record<string, unknown>): void {\n const blocked = ['secret', 'token', 'password', 'credential', 'api_key', 'apikey'];\n const visit = (value: unknown, path: string[]): void => {\n if (!value || typeof value !== 'object') return;\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (blocked.some(term => normalized.includes(term.replace(/[^a-z0-9]/g, '')))) {\n throw new AdapterSettingsError(`Adapter settings cannot store secret-like keys: ${[...path, key].join('.')}`);\n }\n visit(child, [...path, key]);\n }\n };\n visit(config, []);\n}\n\nexport function getAdapterSettings(project = defaultProject, env: NodeJS.ProcessEnv = process.env): AdapterSettingsSnapshot {\n const database = lineageDb();\n try {\n seedDefaults(database, project);\n const rows = database.prepare(`\n select adapter_type, provider, enabled, secret_ref, safe_config_json, updated_at\n from adapter_settings\n where project_id = ?\n order by case adapter_type when 'cloud' then 0 when 'scheduler' then 1 else 2 end\n `).all(project) as unknown as AdapterSettingRow[];\n return { fetchedAt: nowIso(), project, settings: rows.map(row => settingFromRow(row, env)) };\n } finally {\n database.close();\n }\n}\n\nexport function updateAdapterSetting(project = defaultProject, fields: UpdateAdapterSettingFields, env: NodeJS.ProcessEnv = process.env): AdapterSetting {\n if (!fields.confirmWrite) throw new AdapterSettingsError('Adapter settings update requires confirmWrite=true');\n const definition = definitionFor(fields.adapterType, fields.provider);\n const database = lineageDb();\n try {\n seedDefaults(database, project);\n const current = database.prepare(`\n select safe_config_json from adapter_settings\n where project_id = ? and adapter_type = ? and provider = ?\n `).get(project, fields.adapterType, fields.provider) as { safe_config_json: string } | undefined;\n const safeConfig = fields.safeConfig || parseConfig(current?.safe_config_json || '{}') || definition.safeConfig(project);\n rejectSecretLikeConfig(safeConfig);\n const timestamp = nowIso();\n database.prepare(`\n update adapter_settings\n set enabled = ?, safe_config_json = ?, secret_ref = ?, updated_at = ?\n where project_id = ? and adapter_type = ? and provider = ?\n `).run(fields.enabled ? 1 : 0, JSON.stringify(safeConfig), definition.secret_ref, timestamp, project, fields.adapterType, fields.provider);\n const row = database.prepare(`\n select adapter_type, provider, enabled, secret_ref, safe_config_json, updated_at\n from adapter_settings\n where project_id = ? and adapter_type = ? and provider = ?\n `).get(project, fields.adapterType, fields.provider) as unknown as AdapterSettingRow;\n return settingFromRow(row, env);\n } finally {\n database.close();\n }\n}\n", "import type { PostingAdapter, PostingAdapterStatus, PostingCommandResult, PostingDryRunRequest, PostingDryRunResult } from './types';\n\ninterface BufferPostingAdapterDependencies {\n env?: NodeJS.ProcessEnv;\n runBuffer(args: string[]): PostingCommandResult;\n writePayload(payload: Record<string, unknown>): string;\n}\n\nfunction missingConfig(env: NodeJS.ProcessEnv): string[] {\n return ['LINEAGE_SCHEDULER_TOKEN', 'LINEAGE_SCHEDULER_ORGANIZATION_ID'].filter(key => !env[key]);\n}\n\nfunction textForPost(request: PostingDryRunRequest): string {\n const body = request.post.body?.trim() || request.post.title.trim();\n const cta = request.post.cta?.trim();\n const parts = [body, cta].filter(Boolean);\n const text = parts.join('\\n\\n').trim();\n if (!text) throw new Error('Buffer post text is required');\n return text;\n}\n\nexport function buildBufferPostPayload(request: PostingDryRunRequest): Record<string, unknown> {\n const channelId = request.target.channelId.trim();\n if (!channelId) throw new Error('Buffer channelId is required');\n const scheduledAt = request.post.scheduled_at?.trim();\n const payload: Record<string, unknown> = {\n channelId,\n mode: scheduledAt ? 'schedule' : 'addToQueue',\n schedulingType: scheduledAt ? 'scheduled' : 'automatic',\n text: textForPost(request),\n };\n if (scheduledAt) payload.scheduledAt = scheduledAt;\n const media = (request.assets || [])\n .filter(asset => asset.url.trim())\n .map(asset => ({\n altText: asset.altText || asset.assetId,\n url: asset.url,\n }));\n if (media.length > 0) payload.media = media;\n return payload;\n}\n\nexport function createBufferPostingAdapter(deps: BufferPostingAdapterDependencies): PostingAdapter {\n return {\n dryRunPost(request: PostingDryRunRequest): PostingDryRunResult {\n const payload = buildBufferPostPayload(request);\n const inputPath = deps.writePayload(payload);\n const command = ['posts', 'create', '--input', inputPath, '--dry-run', '--output', 'json'];\n const result = deps.runBuffer(command);\n return {\n command,\n output: result.stdout.trim() ? JSON.parse(result.stdout) as unknown : null,\n payload,\n provider: 'buffer',\n };\n },\n\n postLive(): never {\n throw new Error('Live Buffer posting is disabled for this adapter tranche. Use dryRunPost and record reviewed scheduling/posted state in SQLite.');\n },\n\n status(): PostingAdapterStatus {\n const missing = missingConfig(deps.env || process.env);\n return {\n can_dry_run: true,\n can_post: false,\n configured: missing.length === 0,\n missing,\n mode: 'dry-run-only',\n provider: 'buffer',\n };\n },\n };\n}\n", "import { defaultProject, listProjects, validateProject } from '../assetCore';\nimport { createBufferPostingAdapter } from './posting/bufferPostingAdapter';\n\nexport function getAdapterStatus(project: string, env: NodeJS.ProcessEnv = process.env) {\n const summary = listProjects().find(item => item.project === project) || (project === defaultProject ? validateProject(project) : undefined);\n const buffer = createBufferPostingAdapter({\n env,\n runBuffer: () => ({ stdout: '{}', stderr: '' }),\n writePayload: () => '.asset-scratch/buffer-dry-run.json',\n });\n return {\n project,\n fetchedAt: new Date().toISOString(),\n storage: project === defaultProject\n ? [{\n provider: 'local',\n configured: true,\n can_list: true,\n can_upload: false,\n mode: 'public-fallback-catalog',\n default_bucket: null,\n default_region: null,\n }]\n : [{\n provider: 's3',\n configured: Boolean(summary?.default_bucket && summary?.default_region),\n can_list: Boolean(summary?.default_bucket && summary?.default_region),\n can_upload: Boolean(summary?.default_bucket && summary?.default_region),\n mode: 'catalog-backed',\n default_bucket: summary?.default_bucket || null,\n default_region: summary?.default_region || null,\n }],\n posting: [buffer.status()],\n };\n}\n", "import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { listContentPosts } from '../../contentBatches';\nimport { getContentTarget } from '../../contentTargets';\nimport { repoRoot } from '../../assetCore';\nimport { buildBufferPostPayload, createBufferPostingAdapter } from './bufferPostingAdapter';\nimport type { ContentPost } from '../../../shared/types';\nimport type { PostingCommandResult } from './types';\n\nexport class PostingAdapterError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isPostingAdapterError(error: unknown): error is PostingAdapterError {\n return error instanceof PostingAdapterError;\n}\n\nexport interface BufferDryRunFields {\n bufferChannelId: string;\n execute?: boolean;\n postId?: string;\n target?: 'selected';\n}\n\nfunction safeSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'buffer-post';\n}\n\nfunction resolvePost(project: string, fields: BufferDryRunFields): { post: ContentPost; source: 'post' | 'selected_target' } {\n if (fields.postId) {\n const post = listContentPosts(project).posts.find(item => item.id === fields.postId);\n if (!post) throw new PostingAdapterError(`Unknown content post: ${fields.postId}`, 404);\n return { post, source: 'post' };\n }\n if (fields.target === 'selected') {\n const target = getContentTarget(project);\n if (!target.target) throw new PostingAdapterError(`No selected content target exists for ${project}`, 404);\n return { post: target.target.post, source: 'selected_target' };\n }\n throw new PostingAdapterError('Buffer dry run requires postId or target=selected');\n}\n\nfunction payloadPath(project: string, postId: string): string {\n return join(repoRoot, '.asset-scratch', 'buffer-dry-runs', safeSegment(project), `${safeSegment(postId)}.json`);\n}\n\nfunction writePayload(project: string, postId: string, payload: Record<string, unknown>): string {\n const file = payloadPath(project, postId);\n mkdirSync(join(file, '..'), { recursive: true });\n writeFileSync(file, `${JSON.stringify(payload, null, 2)}\\n`);\n return file;\n}\n\nfunction dryRunCommand(inputPath: string): string[] {\n return ['posts', 'create', '--input', inputPath, '--dry-run', '--output', 'json'];\n}\n\nfunction runner(): (args: string[]) => PostingCommandResult {\n return () => ({ stdout: JSON.stringify({ ok: true, dryRun: true }), stderr: '' });\n}\n\nexport function dryRunBufferContentPost(project: string, fields: BufferDryRunFields, env: NodeJS.ProcessEnv = process.env) {\n if (!fields.bufferChannelId.trim()) throw new PostingAdapterError('Buffer dry run requires bufferChannelId');\n const { post, source } = resolvePost(project, fields);\n const request = {\n post,\n target: {\n channelId: fields.bufferChannelId,\n label: post.channel,\n },\n };\n const payload = buildBufferPostPayload(request);\n const inputPath = writePayload(project, post.id, payload);\n const attachedAssets = post.assets.map(asset => ({\n asset_id: asset.asset_id,\n role: asset.role,\n publishable_url: null,\n reason: 'No public media URL is attached to the content post yet.',\n }));\n const adapter = createBufferPostingAdapter({\n env,\n runBuffer: runner(),\n writePayload: () => inputPath,\n });\n const status = adapter.status();\n const result = fields.execute ? adapter.dryRunPost(request) : {\n command: dryRunCommand(inputPath),\n output: null,\n payload,\n provider: 'buffer',\n };\n return {\n ok: true as const,\n project,\n provider: 'buffer',\n mode: 'dry-run-only' as const,\n executed: fields.execute === true,\n can_post: false,\n configured: status.configured,\n missing: status.missing,\n source,\n post: {\n id: post.id,\n batch_id: post.batch_id,\n channel: post.channel,\n phase: post.phase,\n scheduled_at: post.scheduled_at,\n title: post.title,\n },\n target: {\n buffer_channel_id: fields.bufferChannelId,\n label: post.channel,\n },\n command: result.command,\n payload_path: inputPath,\n payload: result.payload,\n output: result.output,\n attached_assets: attachedAssets,\n warnings: [\n 'Live Buffer posting is disabled for this adapter tranche.',\n ...(attachedAssets.length > 0 ? ['Attached assets are not included as Buffer media until they have public publishable URLs.'] : []),\n ],\n fetchedAt: new Date().toISOString(),\n };\n}\n", "import type { ContentPost, ContentPostReadiness, ContentTargetHandoff } from '../shared/types';\n\nexport function readinessForPost(post: ContentPost): ContentPostReadiness {\n if (post.phase === 'skipped' || post.phase === 'archived') return 'skipped_or_archived';\n if (post.phase === 'posted') return 'posted';\n if (post.phase === 'scheduled') return 'scheduled';\n if (post.phase === 'review') return 'in_review';\n return post.assets.length === 0 ? 'needs_asset' : 'draft_ready';\n}\n\nexport function contentPostHandoff(project: string, post?: ContentPost): ContentTargetHandoff {\n const prefix = 'npx lineage content';\n const postId = post?.id || '<post-id>';\n const batchId = post?.batch_id;\n return {\n agentPrompt: post\n ? `Continue content iterations for ${post.title} (${post.id}) on ${post.channel}. Inspect the target, generate or choose assets, attach approved candidates, then move the post through review before scheduling.`\n : 'Inspect or set a content target before generating content or asset variations.',\n attachAssetTemplate: `${prefix} post attach-asset --project ${project} --post-id ${postId} --asset-id <asset-id> --role primary --confirm-write --json`,\n clearTargetCommand: `${prefix} target clear --project ${project} --confirm-write --json`,\n ...(batchId ? { inspectBatchCommand: `${prefix} batch inspect --project ${project} --batch-id ${batchId} --json` } : {}),\n inspectTargetCommand: `${prefix} target inspect --project ${project} --json`,\n markPostedTemplate: `${prefix} post phase --project ${project} --post-id ${postId} --phase posted --posted-at <iso> --url <url> --confirm-write --json`,\n moveToReviewCommand: `${prefix} post phase --project ${project} --post-id ${postId} --phase review --confirm-write --json`,\n scheduleTemplate: `${prefix} post phase --project ${project} --post-id ${postId} --phase scheduled --scheduled-at <iso> --confirm-write --json`,\n setTargetTemplate: `${prefix} target set --project ${project} --post-id ${postId} --notes <notes> --confirm-write --json`,\n };\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { AgentClaimError, listAgentClaims, validateAgentClaimForWrite } from './agentClaims';\nimport { contentPostHandoff, readinessForPost } from './contentPostHandoff';\nimport type {\n ContentBatch,\n ContentBatchDetail,\n ContentBatchFields,\n ContentBatchSnapshot,\n ContentBatchSummary,\n ContentPost,\n ContentPostAsset,\n ContentPostAssetFields,\n ContentPostFields,\n ContentPostPhase,\n ContentPostUpdateFields,\n} from '../shared/types';\n\nconst phases = new Set<ContentPostPhase>(['draft', 'review', 'scheduled', 'posted', 'skipped', 'archived']);\n\nexport class ContentBatchError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isContentBatchError(error: unknown): error is ContentBatchError {\n return error instanceof ContentBatchError;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction requireText(value: string | undefined, label: string): string {\n const text = value?.trim();\n if (!text) throw new ContentBatchError(`Content ${label} is required`);\n return text;\n}\n\nfunction normalizePhase(value: string | undefined): ContentPostPhase {\n const phase = (value || 'draft').replace(/-/g, '_') as ContentPostPhase;\n if (!phases.has(phase)) throw new ContentBatchError(`Unsupported content post phase: ${phase}`);\n return phase;\n}\n\nfunction batchFromRow(row: Record<string, unknown>): ContentBatch {\n return {\n id: String(row.id),\n project: String(row.project_id),\n title: String(row.title),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n status: row.status === 'archived' ? 'archived' : 'active',\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction assetFromRow(row: Record<string, unknown>): ContentPostAsset {\n return {\n asset_id: String(row.asset_id),\n role: String(row.role),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n attached_at: String(row.attached_at),\n };\n}\n\nfunction postFromRow(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n const post = basePost(row, assets);\n return { ...post, handoff: contentPostHandoff(post.project, post), readiness: readinessForPost(post) };\n}\n\nfunction basePost(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n return {\n id: String(row.id),\n project: String(row.project_id),\n batch_id: String(row.batch_id),\n channel: String(row.channel),\n title: String(row.title),\n phase: normalizePhase(String(row.phase)),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n body: typeof row.body === 'string' ? row.body : undefined,\n cta: typeof row.cta === 'string' ? row.cta : undefined,\n scheduled_at: typeof row.scheduled_at === 'string' ? row.scheduled_at : undefined,\n posted_at: typeof row.posted_at === 'string' ? row.posted_at : undefined,\n url: typeof row.url === 'string' ? row.url : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n source_path: typeof row.source_path === 'string' ? row.source_path : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n assets,\n };\n}\n\nfunction postsForBatch(database: DatabaseSync, project: string, batchId: string): ContentPost[] {\n const rows = database.prepare(`\n select * from content_posts\n where project_id = ? and batch_id = ?\n order by updated_at desc, id\n `).all(project, batchId) as Record<string, unknown>[];\n return rows.map(row => postFromRow(row, assetsForPost(database, project, String(row.id))));\n}\n\nfunction assetsForPost(database: DatabaseSync, project: string, postId: string): ContentPostAsset[] {\n return (database.prepare(`\n select asset_id, role, notes, attached_at\n from content_post_assets\n where project_id = ? and post_id = ?\n order by attached_at desc, asset_id\n `).all(project, postId) as Record<string, unknown>[]).map(assetFromRow);\n}\n\nfunction phaseCounts(posts: ContentPost[]): Record<ContentPostPhase, number> {\n return Object.fromEntries([...phases].map(phase => [phase, posts.filter(post => post.phase === phase).length])) as Record<ContentPostPhase, number>;\n}\n\nfunction handoff(project: string, batchId: string): ContentBatchDetail['handoff'] {\n const prefix = `npx lineage content`;\n return {\n inspectCommand: `${prefix} batch inspect --project ${project} --batch-id ${batchId} --json`,\n createPostTemplate: `${prefix} post create --project ${project} --batch-id ${batchId} --post-id <post-id> --channel <channel> --title <title> --confirm-write --json`,\n attachAssetTemplate: `${prefix} post attach-asset --project ${project} --post-id <post-id> --asset-id <asset-id> --role primary --confirm-write --json`,\n phaseTemplate: `${prefix} post phase --project ${project} --post-id <post-id> --phase scheduled --scheduled-at <iso> --confirm-write --json`,\n };\n}\n\nexport function listContentBatches(project: string): ContentBatchSnapshot {\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select * from content_batches\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as Record<string, unknown>[];\n const batches = rows.map(row => {\n const batch = batchFromRow(row);\n const posts = postsForBatch(database, project, batch.id);\n return { ...batch, post_count: posts.length, phase_counts: phaseCounts(posts) } satisfies ContentBatchSummary;\n });\n return { project, fetchedAt: nowIso(), batches };\n } finally {\n database.close();\n }\n}\n\nexport function getContentBatch(project: string, batchId: string): ContentBatchDetail {\n const database = lineageDb();\n try {\n const row = database.prepare('select * from content_batches where project_id = ? and id = ?').get(project, batchId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n const batch = batchFromRow(row);\n return { project, fetchedAt: nowIso(), batch, posts: postsForBatch(database, project, batch.id), handoff: handoff(project, batch.id) };\n } finally {\n database.close();\n }\n}\n\nexport function createContentBatch(project: string, fields: ContentBatchFields) {\n const batchId = requireText(fields.batchId, 'batch id');\n const preview = { id: batchId, project, title: requireText(fields.title, 'batch title'), campaign: fields.campaign, channel: fields.channel, notes: fields.notes };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would create content batch ${batchId}`, preview };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n ensureProject(database, project);\n database.prepare(`\n insert into content_batches (id, project_id, title, campaign, channel, status, notes, created_at, updated_at)\n values (?, ?, ?, ?, ?, 'active', ?, ?, ?)\n on conflict(project_id, id) do update set\n title = excluded.title, campaign = excluded.campaign, channel = excluded.channel,\n status = 'active', notes = excluded.notes, updated_at = excluded.updated_at\n `).run(batchId, project, preview.title, fields.campaign || null, fields.channel || null, fields.notes || null, timestamp, timestamp);\n return { ok: true, message: `Saved content batch ${batchId}`, batch: getContentBatch(project, batchId).batch };\n } finally {\n database.close();\n }\n}\n\nexport function createContentPost(project: string, fields: ContentPostFields) {\n const postId = requireText(fields.postId, 'post id');\n const batchId = requireText(fields.batchId, 'batch id');\n const phase = normalizePhase(fields.phase);\n const preview = { ...fields, postId, batchId, phase, project, title: requireText(fields.title, 'post title'), channel: requireText(fields.channel, 'post channel') };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would create content post ${postId}`, preview };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n ensureProject(database, project);\n const batch = database.prepare('select id from content_batches where project_id = ? and id = ?').get(project, batchId);\n if (!batch) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n database.prepare(`\n insert into content_posts (\n id, project_id, batch_id, channel, title, phase, campaign, body, cta,\n scheduled_at, posted_at, url, notes, source_path, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, id) do update set\n batch_id = excluded.batch_id, channel = excluded.channel, title = excluded.title,\n phase = excluded.phase, campaign = excluded.campaign, body = excluded.body,\n cta = excluded.cta, scheduled_at = excluded.scheduled_at, posted_at = excluded.posted_at,\n url = excluded.url, notes = excluded.notes, source_path = excluded.source_path,\n updated_at = excluded.updated_at\n `).run(postId, project, batchId, preview.channel, preview.title, phase, fields.campaign || null, fields.body || null, fields.cta || null, fields.scheduledAt || null, fields.postedAt || null, fields.url || null, fields.notes || null, fields.sourcePath || null, timestamp, timestamp);\n return { ok: true, message: `Saved content post ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nfunction findContentPost(database: DatabaseSync, project: string, postId: string): ContentPost {\n const row = database.prepare('select * from content_posts where project_id = ? and id = ?').get(project, postId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content post: ${postId}`, 404);\n return postFromRow(row, assetsForPost(database, project, postId));\n}\n\nexport function requireContentPostClaim(project: string, post: ContentPost, claimToken: string | undefined, writeKind: string): void {\n if (!claimToken && !hasActiveContentPostClaim(project, post)) return;\n const validation = validateAgentClaimForWrite({\n channel: post.channel,\n claimToken,\n confirmWrite: true,\n dangerLevel: 'enforce',\n project,\n scopeType: 'content_post',\n targetId: post.id,\n writeKind,\n });\n if (!validation.ok) {\n const status = validation.code === 'claim_required' || validation.code === 'claim_token_invalid' ? 401 : 409;\n throw new AgentClaimError(validation.message, status, validation.code, validation.conflicts);\n }\n}\n\nfunction hasActiveContentPostClaim(project: string, post: ContentPost): boolean {\n return listAgentClaims(project).claims.some(claim => {\n if (claim.project !== project || claim.status !== 'active' || claim.derived_state === 'expired') return false;\n if (claim.scope_type === 'content_post') return claim.target_id === post.id;\n return claim.scope_type === 'project_channel' && (!claim.channel || claim.channel === post.channel);\n });\n}\n\nexport function listContentPosts(project: string, filters: { batchId?: string; channel?: string; phase?: string } = {}) {\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select * from content_posts\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as Record<string, unknown>[];\n const posts = rows.map(row => postFromRow(row, assetsForPost(database, project, String(row.id))))\n .filter(post => !filters.batchId || post.batch_id === filters.batchId)\n .filter(post => !filters.channel || post.channel === filters.channel)\n .filter(post => !filters.phase || post.phase === normalizePhase(filters.phase));\n return { project, fetchedAt: nowIso(), posts };\n } finally {\n database.close();\n }\n}\n\nexport function updateContentPost(project: string, fields: ContentPostUpdateFields) {\n const postId = requireText(fields.postId, 'post id');\n const phase = fields.phase ? normalizePhase(fields.phase) : undefined;\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would update content post ${postId}`, preview: { ...fields, phase, project } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, fields.phase ? 'content_post_phase' : 'content_post_update');\n if (fields.batchId) {\n const batch = database.prepare('select id from content_batches where project_id = ? and id = ?').get(project, fields.batchId);\n if (!batch) throw new ContentBatchError(`Unknown content batch: ${fields.batchId}`, 404);\n }\n const next = {\n batchId: fields.batchId ?? current.batch_id,\n body: fields.body ?? current.body,\n campaign: fields.campaign ?? current.campaign,\n channel: fields.channel ?? current.channel,\n cta: fields.cta ?? current.cta,\n notes: fields.notes ?? current.notes,\n phase: phase ?? current.phase,\n postedAt: fields.postedAt ?? current.posted_at,\n scheduledAt: fields.scheduledAt ?? current.scheduled_at,\n sourcePath: fields.sourcePath ?? current.source_path,\n title: fields.title ?? current.title,\n url: fields.url ?? current.url,\n };\n database.prepare(`\n update content_posts\n set batch_id = ?, channel = ?, title = ?, phase = ?, campaign = ?, body = ?, cta = ?,\n scheduled_at = ?, posted_at = ?, url = ?, notes = ?, source_path = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(next.batchId, next.channel, next.title, next.phase, next.campaign || null, next.body || null, next.cta || null, next.scheduledAt || null, next.postedAt || null, next.url || null, next.notes || null, next.sourcePath || null, timestamp, project, postId);\n return { ok: true, message: `Updated content post ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nexport function attachContentPostAsset(project: string, fields: ContentPostAssetFields) {\n const postId = requireText(fields.postId, 'post id');\n const assetId = requireText(fields.assetId, 'asset id');\n const role = fields.role?.trim() || 'primary';\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would attach ${assetId} to ${postId}`, preview: { postId, assetId, role, notes: fields.notes } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, 'content_post_attach_asset');\n database.prepare(`\n insert into content_post_assets (id, project_id, post_id, asset_id, role, notes, attached_at)\n values (?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, post_id, asset_id, role) do update set notes = excluded.notes, attached_at = excluded.attached_at\n `).run(`${project}:${postId}:${assetId}:${role}`, project, postId, assetId, role, fields.notes || null, timestamp);\n return { ok: true, message: `Attached ${assetId} to ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nexport function detachContentPostAsset(project: string, fields: ContentPostAssetFields) {\n const postId = requireText(fields.postId, 'post id');\n const assetId = requireText(fields.assetId, 'asset id');\n const role = fields.role?.trim() || 'primary';\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would detach ${assetId} from ${postId}`, preview: { postId, assetId, role } };\n const database = lineageDb();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, 'content_post_detach_asset');\n database.prepare('delete from content_post_assets where project_id = ? and post_id = ? and asset_id = ? and role = ?').run(project, postId, assetId, role);\n return { ok: true, message: `Detached ${assetId} from ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { ContentBatchError, requireContentPostClaim } from './contentBatches';\nimport { contentPostHandoff, readinessForPost } from './contentPostHandoff';\nimport type {\n ContentBatch,\n ContentPost,\n ContentPostAsset,\n ContentTargetFields,\n ContentTargetSnapshot,\n} from '../shared/types';\n\nfunction assetFromRow(row: Record<string, unknown>): ContentPostAsset {\n return {\n asset_id: String(row.asset_id),\n role: String(row.role),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n attached_at: String(row.attached_at),\n };\n}\n\nfunction batchFromRow(row: Record<string, unknown>): ContentBatch {\n return {\n id: String(row.id),\n project: String(row.project_id),\n title: String(row.title),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n status: row.status === 'archived' ? 'archived' : 'active',\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction assetsForPost(database: DatabaseSync, project: string, postId: string): ContentPostAsset[] {\n return (database.prepare(`\n select asset_id, role, notes, attached_at from content_post_assets\n where project_id = ? and post_id = ?\n order by attached_at desc, asset_id\n `).all(project, postId) as Record<string, unknown>[]).map(assetFromRow);\n}\n\nfunction postFromRow(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n return {\n id: String(row.id),\n project: String(row.project_id),\n batch_id: String(row.batch_id),\n channel: String(row.channel),\n title: String(row.title),\n phase: String(row.phase) as ContentPost['phase'],\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n body: typeof row.body === 'string' ? row.body : undefined,\n cta: typeof row.cta === 'string' ? row.cta : undefined,\n scheduled_at: typeof row.scheduled_at === 'string' ? row.scheduled_at : undefined,\n posted_at: typeof row.posted_at === 'string' ? row.posted_at : undefined,\n url: typeof row.url === 'string' ? row.url : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n source_path: typeof row.source_path === 'string' ? row.source_path : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n assets,\n };\n}\n\nfunction findPost(database: DatabaseSync, project: string, postId: string): ContentPost {\n const row = database.prepare('select * from content_posts where project_id = ? and id = ?').get(project, postId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content post: ${postId}`, 404);\n return postFromRow(row, assetsForPost(database, project, postId));\n}\n\nfunction findBatch(database: DatabaseSync, project: string, batchId: string): ContentBatch {\n const row = database.prepare('select * from content_batches where project_id = ? and id = ?').get(project, batchId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n return batchFromRow(row);\n}\n\nexport { readinessForPost };\n\nexport function getContentTarget(project: string): ContentTargetSnapshot {\n const database = lineageDb();\n try {\n const row = database.prepare('select post_id, notes, selected_at from content_targets where project_id = ?').get(project) as Record<string, unknown> | undefined;\n if (!row) return { fetchedAt: nowIso(), handoff: contentPostHandoff(project), project, selected: false, target: null };\n const postId = String(row.post_id);\n let post: ContentPost;\n try {\n post = findPost(database, project, postId);\n } catch (error) {\n if (error instanceof ContentBatchError && error.status === 404) {\n database.prepare('delete from content_targets where project_id = ?').run(project);\n return {\n fetchedAt: nowIso(),\n handoff: contentPostHandoff(project),\n project,\n selected: false,\n target: null,\n warning: `Selected content target ${postId} no longer exists and was cleared.`,\n };\n }\n throw error;\n }\n return {\n fetchedAt: nowIso(),\n handoff: contentPostHandoff(project, post),\n project,\n selected: true,\n target: {\n batch: findBatch(database, project, post.batch_id),\n handoff: contentPostHandoff(project, post),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n post,\n readiness: readinessForPost(post),\n selected_at: String(row.selected_at),\n },\n };\n } finally {\n database.close();\n }\n}\n\nexport function setContentTarget(project: string, fields: ContentTargetFields) {\n const postId = fields.postId.trim();\n if (!postId) throw new ContentBatchError('Content target post id is required');\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would select content target ${postId}`, preview: { postId, notes: fields.notes } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const post = findPost(database, project, postId);\n requireContentPostClaim(project, post, fields.claimToken, 'content_target_set');\n database.prepare(`\n insert into content_targets (project_id, post_id, notes, selected_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(project_id) do update set\n post_id = excluded.post_id, notes = excluded.notes,\n selected_at = excluded.selected_at, updated_at = excluded.updated_at\n `).run(project, postId, fields.notes || null, timestamp, timestamp);\n } finally {\n database.close();\n }\n return { ok: true, message: `Selected content target ${postId}`, ...getContentTarget(project) };\n}\n\nexport function clearContentTarget(project: string, confirmWrite: boolean, claimToken?: string) {\n if (!confirmWrite) return { ok: true, dryRun: true, message: 'Would clear selected content target' };\n const database = lineageDb();\n try {\n const row = database.prepare('select post_id from content_targets where project_id = ?').get(project) as { post_id?: string } | undefined;\n if (row?.post_id) {\n try {\n const post = findPost(database, project, String(row.post_id));\n requireContentPostClaim(project, post, claimToken, 'content_target_clear');\n } catch (error) {\n if (!(error instanceof ContentBatchError && error.status === 404)) throw error;\n }\n }\n database.prepare('delete from content_targets where project_id = ?').run(project);\n } finally {\n database.close();\n }\n return { ok: true, message: 'Cleared selected content target', ...getContentTarget(project) };\n}\n", "import type express from 'express';\nimport type { AdapterProvider, AdapterType } from '../../shared/adapterSettingsTypes';\nimport { getAdapterSettings, updateAdapterSetting } from './adapterSettings';\nimport { getAdapterStatus } from './adapterStatus';\nimport { dryRunBufferContentPost } from './posting/bufferPostingService';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function registerAdapterRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/adapters/status', asyncRoute((req, res) => {\n res.json({ ok: true, ...getAdapterStatus(projectFrom(req)) });\n }));\n\n app.get('/api/adapters/settings', asyncRoute((req, res) => {\n res.json({ ok: true, ...getAdapterSettings(projectFrom(req)) });\n }));\n\n app.post('/api/adapters/settings/:adapterType/:provider', asyncRoute((req, res) => {\n res.json({\n ok: true,\n setting: updateAdapterSetting(projectFrom(req), {\n adapterType: req.params.adapterType as AdapterType,\n confirmWrite: req.body.confirmWrite === true,\n enabled: req.body.enabled === true,\n provider: req.params.provider as AdapterProvider,\n safeConfig: req.body.safeConfig && typeof req.body.safeConfig === 'object' ? req.body.safeConfig as Record<string, unknown> : undefined,\n }),\n });\n }));\n\n app.post('/api/adapters/posting/buffer/dry-run', asyncRoute((req, res) => {\n res.json(dryRunBufferContentPost(projectFrom(req), {\n bufferChannelId: String(req.body.bufferChannelId || req.body.bufferChannelID || req.body.buffer_channel_id || ''),\n execute: req.body.execute === true,\n postId: typeof req.body.postId === 'string' ? req.body.postId : undefined,\n target: req.body.target === 'selected' ? 'selected' : undefined,\n }));\n }));\n}\n", "import { Router, type Request } from 'express';\nimport {\n attachContentPostAsset,\n createContentBatch,\n createContentPost,\n detachContentPostAsset,\n getContentBatch,\n listContentBatches,\n listContentPosts,\n updateContentPost,\n} from './contentBatches';\nimport { importDemoContentBatch } from './contentBatchImport';\nimport { getContentOpsQueue } from './contentOpsQueue';\nimport { clearContentTarget, getContentTarget, setContentTarget } from './contentTargets';\nimport type { ContentPostPhase } from '../shared/types';\n\ntype ProjectResolver = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\n\nfunction stringBody(req: Request, key: string): string | undefined {\n const value = (req.body as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction boolBody(req: Request, key: string): boolean {\n return (req.body as Record<string, unknown>)[key] === true;\n}\n\nfunction claimTokenFromRequest(req: Request): string | undefined {\n const header = req.header('X-Lineage-Claim-Token');\n if (header) return header;\n const value = (req.body as Record<string, unknown>).claimToken;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction bodyProjectShape(req: Request): { body?: Record<string, unknown>; query?: Record<string, unknown> } {\n return { body: req.body as Record<string, unknown>, query: req.query };\n}\n\nexport function contentBatchRouter(projectFrom: ProjectResolver): Router {\n const router = Router();\n\n router.get('/batches', (req, res) => {\n res.json(listContentBatches(projectFrom(req)));\n });\n\n router.post('/batches', (req, res) => {\n res.json(createContentBatch(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || stringBody(req, 'id') || '',\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n notes: stringBody(req, 'notes'),\n title: stringBody(req, 'title') || '',\n }));\n });\n\n router.post('/import/demo', (req, res) => {\n const kind = stringBody(req, 'kind');\n res.json(importDemoContentBatch(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || '',\n campaign: stringBody(req, 'campaign'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n kind: kind === 'concepts' || kind === 'drafts' || kind === 'all' ? kind : 'all',\n title: stringBody(req, 'title'),\n }));\n });\n\n router.get('/target', (req, res) => {\n res.json(getContentTarget(projectFrom(req)));\n });\n\n router.get('/queue', (req, res) => {\n res.json(getContentOpsQueue(projectFrom(req)));\n });\n\n router.post('/target', (req, res) => {\n res.json(setContentTarget(projectFrom(bodyProjectShape(req)), {\n claimToken: claimTokenFromRequest(req),\n confirmWrite: boolBody(req, 'confirmWrite'),\n notes: stringBody(req, 'notes'),\n postId: stringBody(req, 'postId') || '',\n }));\n });\n\n router.post('/target/clear', (req, res) => {\n res.json(clearContentTarget(projectFrom(bodyProjectShape(req)), boolBody(req, 'confirmWrite'), claimTokenFromRequest(req)));\n });\n\n router.get('/batches/:batchId', (req, res) => {\n res.json(getContentBatch(projectFrom(req), req.params.batchId));\n });\n\n router.get('/posts', (req, res) => {\n res.json(listContentPosts(projectFrom(req), {\n batchId: typeof req.query.batchId === 'string' ? req.query.batchId : undefined,\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n phase: typeof req.query.phase === 'string' ? req.query.phase : undefined,\n }));\n });\n\n router.post('/posts', (req, res) => {\n res.json(createContentPost(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || '',\n body: stringBody(req, 'body'),\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n cta: stringBody(req, 'cta'),\n notes: stringBody(req, 'notes'),\n phase: stringBody(req, 'phase') as ContentPostPhase | undefined,\n postId: stringBody(req, 'postId') || stringBody(req, 'id') || '',\n sourcePath: stringBody(req, 'sourcePath'),\n title: stringBody(req, 'title') || '',\n }));\n });\n\n router.post('/posts/:postId', (req, res) => {\n res.json(updateContentPost(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId'),\n body: stringBody(req, 'body'),\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n cta: stringBody(req, 'cta'),\n notes: stringBody(req, 'notes'),\n phase: stringBody(req, 'phase') as ContentPostPhase | undefined,\n postedAt: stringBody(req, 'postedAt'),\n postId: req.params.postId,\n scheduledAt: stringBody(req, 'scheduledAt'),\n sourcePath: stringBody(req, 'sourcePath'),\n title: stringBody(req, 'title'),\n url: stringBody(req, 'url'),\n }));\n });\n\n router.post('/posts/:postId/assets', (req, res) => {\n res.json(attachContentPostAsset(projectFrom(bodyProjectShape(req)), {\n assetId: stringBody(req, 'assetId') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n notes: stringBody(req, 'notes'),\n postId: req.params.postId,\n role: stringBody(req, 'role'),\n }));\n });\n\n router.post('/posts/:postId/assets/detach', (req, res) => {\n res.json(detachContentPostAsset(projectFrom(bodyProjectShape(req)), {\n assetId: stringBody(req, 'assetId') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n postId: req.params.postId,\n role: stringBody(req, 'role'),\n }));\n });\n\n return router;\n}\n", "import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { basename, join, relative } from 'node:path';\nimport { repoRoot } from './assetCore';\nimport { attachContentPostAsset, createContentBatch, createContentPost } from './contentBatches';\nimport type { ContentPostPhase } from '../shared/types';\n\ntype ImportKind = 'all' | 'concepts' | 'drafts';\n\ninterface MarkdownItem {\n body: string;\n campaign?: string;\n channel: string;\n cta?: string;\n kind: 'concept' | 'draft';\n postId: string;\n relatedAsset?: string;\n sourcePath: string;\n title: string;\n phase: ContentPostPhase;\n}\n\nexport interface ContentImportOptions {\n batchId: string;\n confirmWrite: boolean;\n campaign?: string;\n kind?: ImportKind;\n title?: string;\n}\n\nfunction walk(dir: string): string[] {\n return readdirSync(dir, { withFileTypes: true }).flatMap(entry => {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) return walk(path);\n return entry.isFile() && entry.name.endsWith('.md') ? [path] : [];\n });\n}\n\nfunction metadata(text: string): Record<string, string> {\n return Object.fromEntries(\n [...text.matchAll(/^- ([^:]+):\\s*(.+)$/gm)].map(match => [match[1].trim().toLowerCase(), match[2].trim()])\n );\n}\n\nfunction normalizeChannel(value: string): string {\n const channel = value.trim().toLowerCase();\n if (channel === 'linkedin') return 'linkedin';\n if (channel === 'tiktok') return 'tiktok';\n if (channel === 'youtube') return 'youtube';\n if (channel === 'meta') return 'meta';\n if (channel === 'x/twitter' || channel === 'twitter' || channel === 'x') return 'x-twitter';\n return channel;\n}\n\nfunction phaseFromStatus(value?: string): ContentPostPhase {\n const phase = value?.trim().toLowerCase().replace(/-/g, '_');\n if (phase === 'review' || phase === 'scheduled' || phase === 'posted' || phase === 'skipped' || phase === 'archived') return phase;\n return 'draft';\n}\n\nfunction postIdFor(kind: MarkdownItem['kind'], file: string): string {\n const slug = basename(file, '.md').replace(/^\\d{4}-\\d{2}-/, '');\n return `${kind}-${slug}`;\n}\n\nfunction itemFromFile(file: string): MarkdownItem | null {\n const parts = file.split('/');\n const kind = parts.includes('drafts') ? 'draft' : parts.includes('concepts') ? 'concept' : null;\n if (!kind) return null;\n const text = readFileSync(file, 'utf8');\n const meta = metadata(text);\n const pathChannel = parts[parts.indexOf('channels') + 1] || '';\n const relatedAsset = meta['related asset'] && meta['related asset'] !== 'none yet' ? meta['related asset'] : undefined;\n return {\n body: text,\n campaign: meta.campaign,\n channel: normalizeChannel(meta.channel || pathChannel),\n cta: meta.cta,\n kind,\n phase: phaseFromStatus(meta.status),\n postId: postIdFor(kind, file),\n relatedAsset,\n sourcePath: relative(repoRoot, file),\n title: text.match(/^#\\s+(.+)$/m)?.[1] || basename(file, '.md'),\n };\n}\n\nfunction demoMarkdownItems(kind: ImportKind): MarkdownItem[] {\n const root = process.env.LINEAGE_CONTENT_SOURCE_ROOT || join(repoRoot, 'demo-project', 'channels');\n if (!existsSync(root)) return [];\n return walk(root)\n .map(itemFromFile)\n .filter((item): item is MarkdownItem => Boolean(item))\n .filter(item => kind === 'all' || `${item.kind}s` === kind)\n .sort((a, b) => a.sourcePath.localeCompare(b.sourcePath));\n}\n\nexport function importDemoContentBatch(project: string, options: ContentImportOptions) {\n const kind = options.kind || 'all';\n const items = demoMarkdownItems(kind);\n const batch = {\n batchId: options.batchId,\n campaign: options.campaign || '2026-06-organic-traffic-test',\n confirmWrite: options.confirmWrite,\n notes: `Imported ${kind} from demo-project/channels markdown.`,\n title: options.title || 'Demo imported content batch',\n };\n if (!options.confirmWrite) {\n return { ok: true, dryRun: true, batch, counts: countsFor(items), items: previewItems(items) };\n }\n createContentBatch(project, batch);\n let attached = 0;\n for (const item of items) {\n createContentPost(project, {\n batchId: options.batchId,\n body: item.body,\n campaign: item.campaign || batch.campaign,\n channel: item.channel,\n confirmWrite: true,\n cta: item.cta,\n notes: `Imported ${item.kind} from ${item.sourcePath}`,\n phase: item.phase,\n postId: item.postId,\n sourcePath: item.sourcePath,\n title: item.title,\n });\n if (item.relatedAsset) {\n attachContentPostAsset(project, { assetId: item.relatedAsset, confirmWrite: true, postId: item.postId, role: 'related' });\n attached += 1;\n }\n }\n return { ok: true, batch_id: options.batchId, counts: { ...countsFor(items), attached }, items: previewItems(items) };\n}\n\nfunction countsFor(items: MarkdownItem[]) {\n return {\n concepts: items.filter(item => item.kind === 'concept').length,\n drafts: items.filter(item => item.kind === 'draft').length,\n total: items.length,\n };\n}\n\nfunction previewItems(items: MarkdownItem[]) {\n return items.map(item => ({\n channel: item.channel,\n kind: item.kind,\n phase: item.phase,\n post_id: item.postId,\n related_asset: item.relatedAsset,\n source_path: item.sourcePath,\n title: item.title,\n }));\n}\n", "import { listAssets } from './assetCore';\nimport { getAssetReviewMap } from './assetReviews';\nimport { nowIso } from './assetLineageDb';\nimport { listContentPosts } from './contentBatches';\nimport { getContentTarget, readinessForPost } from './contentTargets';\nimport type { AssetReviewState, ContentOpsQueueAssetStorage, ContentOpsQueueBackupCue, ContentOpsQueueItem, ContentOpsQueueLane, ContentOpsQueueLaneId, ContentOpsQueueLaneSummary, ContentOpsQueueSnapshot, ContentPost } from '../shared/types';\n\nconst lanes = [\n ['next_target', 'Next Target'],\n ['needs_asset', 'Needs Assets'],\n ['draft_ready', 'Draft Ready'],\n ['in_review', 'In Review'],\n ['scheduled', 'Scheduled'],\n ['posted', 'Posted'],\n ['skipped_or_archived', 'Skipped or Archived'],\n] satisfies Array<[ContentOpsQueueLaneId, string]>;\n\ntype AssetSources = { local: boolean; review_state?: AssetReviewState; s3: boolean };\nconst actionableLaneOrder: ContentOpsQueueLaneId[] = ['needs_asset', 'draft_ready', 'in_review', 'scheduled'];\n\nfunction emptyStorage(): ContentOpsQueueAssetStorage {\n return { local: 0, s3: 0, total: 0, unresolved: 0 };\n}\n\nfunction addStorage(left: ContentOpsQueueAssetStorage, right: ContentOpsQueueAssetStorage): ContentOpsQueueAssetStorage {\n return {\n local: left.local + right.local,\n s3: left.s3 + right.s3,\n total: left.total + right.total,\n unresolved: left.unresolved + right.unresolved,\n };\n}\n\nfunction collectAssetSources(project: string): Map<string, AssetSources> {\n const sources = new Map<string, AssetSources>();\n const pageSize = 100;\n let page = 1;\n while (true) {\n const snapshot = listAssets(project, { page, pageSize, source: 'all' });\n for (const asset of snapshot.assets) {\n const current = sources.get(asset.asset_id) || { local: false, s3: false };\n sources.set(asset.asset_id, {\n local: current.local || Boolean(asset.local),\n s3: current.s3 || Boolean(asset.s3),\n });\n }\n if (page >= snapshot.pagination.totalPages) break;\n page += 1;\n }\n const localAssetIds = [...sources].filter(([, source]) => source.local).map(([assetId]) => assetId);\n const reviewMap = getAssetReviewMap(project, localAssetIds);\n for (const assetId of localAssetIds) {\n const source = sources.get(assetId);\n if (source) source.review_state = reviewMap[assetId]?.review_state || 'unreviewed';\n }\n return sources;\n}\n\nfunction storageForPost(post: ContentPost, sources: Map<string, AssetSources>): ContentOpsQueueAssetStorage {\n return post.assets.reduce((storage, asset) => {\n const source = sources.get(asset.asset_id);\n return {\n local: storage.local + (source?.local ? 1 : 0),\n s3: storage.s3 + (source?.s3 ? 1 : 0),\n total: storage.total + 1,\n unresolved: storage.unresolved + (!source?.local && !source?.s3 ? 1 : 0),\n };\n }, emptyStorage());\n}\n\nfunction backupCueForPost(project: string, post: ContentPost, sources: Map<string, AssetSources>): ContentOpsQueueBackupCue | undefined {\n let approvedLocal = 0;\n let localAndS3 = 0;\n let localOnly = 0;\n let needsReview = 0;\n let s3Backed = 0;\n let unresolved = 0;\n let firstLocalOnly = '';\n for (const asset of post.assets) {\n const source = sources.get(asset.asset_id);\n if (source?.local && source.s3) localAndS3 += 1;\n else if (source?.local) {\n localOnly += 1;\n firstLocalOnly ||= asset.asset_id;\n if (source.review_state === 'approved') approvedLocal += 1;\n else needsReview += 1;\n } else if (source?.s3) s3Backed += 1;\n else unresolved += 1;\n }\n if (post.assets.length === 0) return undefined;\n const label = localOnly > 0\n ? `${localOnly} local-only${needsReview > 0 ? ` \u00B7 ${needsReview} need review before backup` : ' \u00B7 approved for backup'}`\n : localAndS3 > 0 ? `${localAndS3} local + S3 backed`\n : s3Backed > 0 ? `${s3Backed} S3 backed`\n : `${unresolved} unresolved`;\n return {\n approved_local: approvedLocal,\n label,\n local_and_s3: localAndS3,\n local_backup_command: firstLocalOnly ? `npx lineage local backup --project ${project} --asset-id ${firstLocalOnly} --dry-run --json` : undefined,\n local_only: localOnly,\n local_queue_command: firstLocalOnly ? `npx lineage local queue --project ${project} --json` : undefined,\n local_review_command: firstLocalOnly ? `npx lineage local review --project ${project} --asset-id ${firstLocalOnly} --state approved --dry-run --json` : undefined,\n needs_review: needsReview,\n s3_backed: s3Backed,\n unresolved,\n };\n}\n\nfunction itemFor(project: string, post: ContentPost, targetPostId: string | undefined, sources: Map<string, AssetSources>): ContentOpsQueueItem {\n const readiness = post.readiness || readinessForPost(post);\n return {\n asset_storage: storageForPost(post, sources),\n attached_asset_count: post.assets.length,\n backup_cue: backupCueForPost(project, post, sources),\n handoff: post.handoff,\n is_target: post.id === targetPostId,\n post,\n readiness,\n };\n}\n\nfunction laneFor(id: ContentOpsQueueLaneId, items: ContentOpsQueueItem[]): ContentOpsQueueLane {\n const label = lanes.find(([laneId]) => laneId === id)?.[1] || id;\n return { id, label, items, total: items.length };\n}\n\nfunction laneSummary(lane: ContentOpsQueueLane): ContentOpsQueueLaneSummary {\n return { id: lane.id, label: lane.label, total: lane.total };\n}\n\nfunction prefix(): string {\n return `npx lineage content queue`;\n}\n\nfunction compactItem(item: ContentOpsQueueItem | undefined) {\n if (!item) return null;\n return {\n asset_storage: item.asset_storage,\n attached_asset_count: item.attached_asset_count,\n batch_id: item.post.batch_id,\n channel: item.post.channel,\n is_target: item.is_target,\n next_commands: {\n attachAssetTemplate: item.handoff?.attachAssetTemplate,\n inspectBatchCommand: item.handoff?.inspectBatchCommand,\n markPostedTemplate: item.handoff?.markPostedTemplate,\n moveToReviewCommand: item.handoff?.moveToReviewCommand,\n scheduleTemplate: item.handoff?.scheduleTemplate,\n setTargetTemplate: item.handoff?.setTargetTemplate,\n },\n backup_cue: item.backup_cue,\n phase: item.post.phase,\n post_id: item.post.id,\n readiness: item.readiness,\n title: item.post.title,\n };\n}\n\nfunction firstLaneItem(queueLanes: ContentOpsQueueLane[], laneOrder: ContentOpsQueueLaneId[]): { item: ContentOpsQueueItem; lane: ContentOpsQueueLane } | null {\n for (const laneId of laneOrder) {\n const lane = queueLanes.find(candidate => candidate.id === laneId);\n const item = lane?.items[0];\n if (lane && item) return { item, lane };\n }\n return null;\n}\n\nfunction compactHandoff(project: string, queue: ContentOpsQueueSnapshot) {\n return {\n ...queue.handoff,\n inspectSummaryCommand: `${prefix()} inspect --project ${project} --summary --json`,\n nextQueueCommand: `${prefix()} next --project ${project} --json`,\n };\n}\n\nexport function getContentOpsQueue(project: string): ContentOpsQueueSnapshot {\n const posts = listContentPosts(project).posts;\n const target = getContentTarget(project);\n const targetPostId = target.target?.post.id;\n const sources = collectAssetSources(project);\n const items = posts.map(post => itemFor(project, post, targetPostId, sources));\n const queueLanes = lanes.map(([id]) => {\n const laneItems = id === 'next_target'\n ? items.filter(item => item.is_target)\n : items.filter(item => item.readiness === id);\n return laneFor(id, laneItems);\n });\n const nextAction = firstLaneItem(queueLanes, actionableLaneOrder);\n const storage = items.reduce((total, item) => addStorage(total, item.asset_storage), emptyStorage());\n const laneTotals = Object.fromEntries(queueLanes.map(lane => [lane.id, lane.total])) as Record<ContentOpsQueueLaneId, number>;\n const contentPrefix = `npx lineage content`;\n return {\n fetchedAt: nowIso(),\n handoff: {\n inspectQueueCommand: `${contentPrefix} queue inspect --project ${project} --json`,\n inspectTargetCommand: `${contentPrefix} target inspect --project ${project} --json`,\n listPostsCommand: `${contentPrefix} post list --project ${project} --json`,\n },\n lanes: queueLanes,\n next_action: nextAction?.item || null,\n next_action_lane: nextAction ? laneSummary(nextAction.lane) : null,\n project,\n target: target.target,\n totals: {\n attached_assets: items.reduce((sum, item) => sum + item.attached_asset_count, 0),\n lanes: laneTotals,\n posts: posts.length,\n selected_target: target.selected ? 1 : 0,\n storage,\n },\n warning: target.warning,\n };\n}\n\nexport function getContentOpsQueueSummary(project: string) {\n const queue = getContentOpsQueue(project);\n const nextAction = queue.next_action && queue.next_action_lane ? { item: queue.next_action, lane: queue.next_action_lane } : null;\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lanes: queue.totals.lanes,\n next: compactItem(nextAction?.item),\n next_action: compactItem(nextAction?.item),\n next_action_lane: nextAction?.lane.id || null,\n next_lane: nextAction?.lane.id || null,\n project: queue.project,\n storage: queue.totals.storage,\n target: compactItem(queue.lanes.find(lane => lane.id === 'next_target')?.items[0]),\n totals: {\n attached_assets: queue.totals.attached_assets,\n posts: queue.totals.posts,\n selected_target: queue.totals.selected_target,\n },\n warning: queue.warning,\n };\n}\n\nexport function getContentOpsQueueNext(project: string) {\n const queue = getContentOpsQueue(project);\n const nextAction = queue.next_action && queue.next_action_lane ? { item: queue.next_action, lane: queue.next_action_lane } : null;\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lane: nextAction ? nextAction.lane : null,\n next: compactItem(nextAction?.item),\n next_action: compactItem(nextAction?.item),\n next_action_lane: nextAction?.lane.id || null,\n project: queue.project,\n storage: queue.totals.storage,\n target: compactItem(queue.lanes.find(lane => lane.id === 'next_target')?.items[0]),\n warning: queue.warning || (nextAction ? undefined : 'No actionable content queue item found.'),\n };\n}\n\nexport function getContentOpsQueueLane(project: string, laneId: ContentOpsQueueLaneId) {\n const queue = getContentOpsQueue(project);\n const lane = queue.lanes.find(item => item.id === laneId);\n if (!lane) throw new Error(`Unknown content queue lane: ${laneId}`);\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lane: {\n id: lane.id,\n items: lane.items.map(compactItem),\n label: lane.label,\n total: lane.total,\n },\n project: queue.project,\n storage: queue.totals.storage,\n totals: queue.totals,\n warning: queue.warning,\n };\n}\n", "import { existsSync, realpathSync, statSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { defaultProject, repoRoot } from './assetCore';\nimport { getLineageNextAsset, getLineageSnapshot, indexLineageAssets, listLineageRerollRequests, recordLineageRerollAttempt } from './assetLineage';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { activeLineageWorkspaceRoot } from './assetLineageWorkspaces';\nimport { contentTypeFor, fileSha256 } from './localReview';\nimport type {\n GenerationHandoffPacket,\n GenerationImportResponse,\n GenerationInspectResponse,\n GenerationJob,\n GenerationJobInput,\n GenerationJobOutput,\n GenerationJobReceipt,\n GenerationPlanResponse,\n GenerationProvider,\n GenerationSourceMode,\n LineageNextResponse,\n LineageRerollRequest,\n} from '../shared/types';\n\nconst adapterVersion = 'generation-receipts-v1';\nconst provider: GenerationProvider = 'codex-handoff';\n\nclass GenerationReceiptError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isGenerationReceiptError(error: unknown): error is GenerationReceiptError {\n return error instanceof GenerationReceiptError;\n}\n\nfunction jobId(): string {\n return `gen-${Date.now().toString(36)}-${randomUUID().slice(0, 8)}`;\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n return JSON.parse(value) as T;\n}\n\nfunction positiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) > 0;\n}\n\nfunction resolveLineageSelection(project: string): LineageNextResponse {\n const rootAssetId = activeLineageWorkspaceRoot(project);\n if (!rootAssetId) throw new GenerationReceiptError('No active lineage workspace for generation planning');\n const next = getLineageNextAsset(project, rootAssetId);\n if (!next.next_asset) throw new GenerationReceiptError(`No clear lineage next asset: ${next.reason}`);\n if (next.strategy !== 'selected') throw new GenerationReceiptError('Generation v1 requires an explicit selected lineage next base');\n if (next.selection_mode !== 'multiple' && next.selection?.asset_id !== next.next_asset.asset_id) throw new GenerationReceiptError('Generation v1 requires one explicit selected lineage next base');\n return next;\n}\n\nfunction selectedParents(next: LineageNextResponse) {\n const parents = next.next_assets.length > 0 ? next.next_assets : next.next_asset ? [next.next_asset] : [];\n if (parents.length === 0) throw new GenerationReceiptError('Missing lineage next base');\n return parents;\n}\n\nfunction parentMappings(next: LineageNextResponse, perBaseCount: number) {\n return selectedParents(next).map((parent, parentIndex) => ({\n parent,\n output_indexes: Array.from({ length: perBaseCount }, (_value, index) => parentIndex * perBaseCount + index),\n }));\n}\n\nfunction buildHandoff(project: string, id: string, prompt: string, count: number, perBaseCount: number, next: LineageNextResponse): GenerationHandoffPacket {\n const parent = next.next_asset;\n if (!parent) throw new GenerationReceiptError('Missing lineage next base');\n const parents = parentMappings(next, perBaseCount);\n const importFilesFlag = parents.length > 1\n ? `--parent-files ${quote(parents.map(mapping => `${mapping.parent.asset_id}=<${mapping.output_indexes.map(index => `file-${index}`).join(',')}>`).join(';'))}`\n : '--files <comma-separated-.asset-scratch-files>';\n const importCommand = `npx lineage generate image import --project ${quote(project)} --job-id ${quote(id)} ${importFilesFlag} --confirm-write --json`;\n return {\n schema_version: 'lineage.generation_handoff.v1', provider, project, job_id: id, prompt, expected_output_count: count,\n per_base_count: next.selection_mode === 'multiple' ? perBaseCount : undefined,\n lineage: {\n root_asset_id: next.root_asset_id, parent_asset_id: parent.asset_id, selection_strategy: next.strategy,\n parent_title: parent.title, parent_local_path: parent.local_path, parent_s3_key: parent.s3_key,\n parents: parents.length > 1 ? parents.map(mapping => ({\n parent_asset_id: mapping.parent.asset_id, parent_title: mapping.parent.title,\n parent_local_path: mapping.parent.local_path, parent_s3_key: mapping.parent.s3_key, output_indexes: mapping.output_indexes,\n })) : undefined,\n },\n instructions: [\n 'Use Codex image generation outside Lineage server code.',\n 'Write generated output files under .asset-scratch before import.',\n 'Do not call live provider APIs from the CLI or server.',\n 'Import the exact expected output count with --confirm-write to persist lineage children.',\n 'For multiple selected bases, prefer --parent-files so each generated file is tied to its selected parent.',\n ],\n import_command: importCommand,\n guardrails: { live_generation: false, external_services: false, output_root: '.asset-scratch', confirm_write_required: true },\n };\n}\n\nfunction buildRerollHandoff(project: string, id: string, prompt: string, rootAssetId: string, target: { asset_id: string; title: string; local_path?: string; s3_key?: string }, request: LineageRerollRequest): GenerationHandoffPacket {\n const importCommand = `npx lineage reroll import --project ${quote(project)} --job-id ${quote(id)} --file <.asset-scratch-file> --confirm-write --json`;\n return {\n schema_version: 'lineage.generation_handoff.v1',\n provider,\n project,\n job_id: id,\n prompt,\n expected_output_count: 1,\n lineage: {\n root_asset_id: rootAssetId,\n parent_asset_id: target.asset_id,\n selection_strategy: 'reroll_request',\n parent_title: target.title,\n parent_local_path: target.local_path,\n parent_s3_key: target.s3_key,\n },\n instructions: [\n 'Use Codex image generation outside Lineage server code.',\n 'Write the regenerated output file under .asset-scratch before import.',\n 'Do not call live provider APIs from the CLI or server.',\n 'Import exactly one output with reroll import, not link-child or generate image import.',\n `Resolve re-roll request ${request.id}; do not create a visible lineage child edge.`,\n ],\n import_command: importCommand,\n guardrails: { live_generation: false, external_services: false, output_root: '.asset-scratch', confirm_write_required: true },\n };\n}\n\nfunction inputsFrom(jobIdValue: string, project: string, next: LineageNextResponse): GenerationJobInput[] {\n return selectedParents(next).map((parent, position) => ({\n id: `${jobIdValue}:input:${position}`,\n job_id: jobIdValue,\n project_id: project,\n asset_id: parent.asset_id,\n root_asset_id: next.root_asset_id,\n role: 'lineage_next_base',\n position,\n selection_strategy: next.strategy,\n selection_snapshot: next,\n }));\n}\n\nfunction receiptFrom(row: Record<string, unknown>): GenerationJobReceipt {\n return {\n id: String(row.id),\n job_id: String(row.job_id),\n receipt_type: row.receipt_type as GenerationJobReceipt['receipt_type'],\n status: row.status as GenerationJobReceipt['status'],\n command: String(row.command),\n payload: parseJson(String(row.payload_json), null),\n created_at: String(row.created_at),\n };\n}\n\nfunction outputFrom(row: Record<string, unknown>): GenerationJobOutput {\n return {\n id: String(row.id),\n job_id: String(row.job_id),\n project_id: String(row.project_id),\n output_index: Number(row.output_index),\n file_path: String(row.file_path),\n checksum_sha256: String(row.checksum_sha256),\n size_bytes: Number(row.size_bytes),\n content_type: String(row.content_type),\n imported_asset_id: String(row.imported_asset_id),\n parent_asset_id: String(row.parent_asset_id),\n imported_at: String(row.imported_at),\n };\n}\n\nexport function loadGenerationJob(database: DatabaseSync, project: string, id: string): GenerationJob {\n const row = database.prepare('select * from generation_jobs where project_id = ? and id = ?').get(project, id) as Record<string, unknown> | undefined;\n if (!row) throw new GenerationReceiptError(`Unknown generation job: ${id}`, 404);\n const inputRows = database.prepare('select * from generation_job_inputs where job_id = ? order by position').all(id) as Array<Record<string, unknown>>;\n const inputs = inputRows.map(input => ({\n id: String(input.id),\n job_id: String(input.job_id),\n project_id: String(input.project_id),\n asset_id: String(input.asset_id),\n root_asset_id: String(input.root_asset_id),\n role: input.role as GenerationJobInput['role'],\n position: Number(input.position),\n selection_strategy: String(input.selection_strategy),\n selection_snapshot: parseJson<LineageNextResponse>(String(input.selection_snapshot_json), {} as LineageNextResponse),\n }));\n const outputs = (database.prepare('select * from generation_job_outputs where job_id = ? order by output_index').all(id) as Array<Record<string, unknown>>).map(outputFrom);\n const receipts = (database.prepare('select * from generation_job_receipts where job_id = ? order by created_at, id').all(id) as Array<Record<string, unknown>>).map(receiptFrom);\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n provider: row.provider as GenerationProvider,\n adapter_version: String(row.adapter_version),\n source_mode: String(row.source_mode) as GenerationSourceMode,\n root_asset_id: String(row.root_asset_id),\n prompt: String(row.prompt),\n expected_output_count: Number(row.expected_output_count),\n status: row.status as GenerationJob['status'],\n output_dir: typeof row.output_dir === 'string' ? row.output_dir : undefined,\n handoff: parseJson<GenerationHandoffPacket>(String(row.handoff_json), {} as GenerationHandoffPacket),\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n imported_at: typeof row.imported_at === 'string' ? row.imported_at : undefined,\n inputs,\n outputs,\n receipts,\n };\n}\n\nfunction insertReceipt(database: DatabaseSync, id: string, type: 'plan' | 'import' | 'error', command: string, payload: unknown): void {\n database.prepare(`\n insert into generation_job_receipts (id, job_id, receipt_type, status, command, payload_json, created_at)\n values (?, ?, ?, 'ok', ?, ?, ?)\n `).run(`${id}:receipt:${type}:${Date.now()}`, id, type, command, JSON.stringify(payload), nowIso());\n}\n\nexport function planImageGeneration(project = defaultProject, fields: { prompt: string; count?: number; dryRun?: boolean; fromLineageSelection: boolean; perBaseCount?: number }): GenerationPlanResponse {\n const prompt = fields.prompt.trim();\n if (!prompt) throw new GenerationReceiptError('Missing --prompt');\n if (!fields.fromLineageSelection) throw new GenerationReceiptError('Generation v1 requires --from-lineage-selection');\n const next = resolveLineageSelection(project);\n const parentCount = selectedParents(next).length;\n if (parentCount > 1 && !positiveInteger(fields.perBaseCount)) throw new GenerationReceiptError('Multi-parent generation requires --per-base-count');\n const perBaseCount = parentCount > 1 ? Number(fields.perBaseCount) : Number(fields.count ?? fields.perBaseCount);\n const count = parentCount * perBaseCount;\n if (!positiveInteger(perBaseCount)) throw new GenerationReceiptError('Generation count must be a positive integer');\n if (fields.count !== undefined && fields.count !== count) throw new GenerationReceiptError(`Generation count mismatch: expected ${count} from selected bases, received ${fields.count}`);\n const id = jobId();\n const handoff = buildHandoff(project, id, prompt, count, perBaseCount, next);\n const inputs = inputsFrom(id, project, next);\n const mappings = parentMappings(next, perBaseCount).map(mapping => ({ parent_asset_id: mapping.parent.asset_id, output_indexes: mapping.output_indexes }));\n const timestamp = nowIso();\n const preview: GenerationJob = {\n id,\n project_id: project,\n provider,\n adapter_version: adapterVersion,\n source_mode: 'lineage_selection',\n root_asset_id: next.root_asset_id,\n prompt,\n expected_output_count: count,\n status: 'planned',\n output_dir: '.asset-scratch',\n handoff,\n created_at: timestamp,\n updated_at: timestamp,\n inputs,\n outputs: [],\n receipts: [{\n id: `${id}:receipt:plan:preview`,\n job_id: id,\n receipt_type: 'plan',\n status: 'ok',\n command: 'generate image plan',\n payload: { prompt, expected_output_count: count, per_base_count: parentCount > 1 ? perBaseCount : undefined, lineage: handoff.lineage, parent_mappings: mappings },\n created_at: timestamp,\n }],\n };\n if (fields.dryRun) return { ok: true, command: 'generate image plan', project, dryRun: true, wouldWrite: true, job: preview };\n\n const database = lineageDb();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(`\n insert into generation_jobs (\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at\n ) values (?, ?, ?, ?, 'lineage_selection', ?, ?, ?, 'planned', ?, ?, ?, ?)\n `).run(id, project, provider, adapterVersion, next.root_asset_id, prompt, count, '.asset-scratch', JSON.stringify(handoff), timestamp, timestamp);\n const insertInput = database.prepare('insert into generation_job_inputs (id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json) values (?, ?, ?, ?, ?, ?, ?, ?, ?)');\n for (const input of inputs) insertInput.run(input.id, id, project, input.asset_id, input.root_asset_id, input.role, input.position, input.selection_strategy, JSON.stringify(next));\n insertReceipt(database, id, 'plan', 'generate image plan', preview.receipts[0].payload);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, command: 'generate image plan', project, job: loadGenerationJob(database, project, id) };\n } finally {\n database.close();\n }\n}\n\nexport function planImageReroll(project = defaultProject, fields: { rootAssetId: string; targetAssetId: string; prompt: string; dryRun?: boolean }): GenerationPlanResponse {\n const prompt = fields.prompt.trim();\n if (!prompt) throw new GenerationReceiptError('Missing --prompt');\n if (!fields.rootAssetId) throw new GenerationReceiptError('Missing --root');\n if (!fields.targetAssetId) throw new GenerationReceiptError('Missing --target');\n const snapshot = getLineageSnapshot(project, fields.rootAssetId);\n const target = snapshot.nodes.find(node => node.asset_id === fields.targetAssetId);\n if (!target) throw new GenerationReceiptError(`Re-roll target is not in lineage: ${fields.targetAssetId}`, 404);\n const request = listLineageRerollRequests(project, snapshot.root_asset_id).requests.find(item => item.node_asset_id === fields.targetAssetId);\n if (!request) throw new GenerationReceiptError(`No pending re-roll request for ${fields.targetAssetId}`);\n const id = jobId();\n const timestamp = nowIso();\n const handoff = buildRerollHandoff(project, id, prompt, snapshot.root_asset_id, target, request);\n const input: GenerationJobInput = {\n id: `${id}:input:0`,\n job_id: id,\n project_id: project,\n asset_id: target.asset_id,\n root_asset_id: snapshot.root_asset_id,\n role: 'reroll_target',\n position: 0,\n selection_strategy: 'reroll_request',\n selection_snapshot: {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'selected',\n selection_mode: 'single',\n recommended_action: 'evolve_variations',\n reason: 'user_selected',\n next_asset: target,\n next_assets: [target],\n latest: snapshot.latest,\n selected: [target.asset_id],\n selection: null,\n selections: [],\n candidates: snapshot.nodes,\n warnings: ['Re-roll target: import output as an attempt, not a lineage child.'],\n fetchedAt: timestamp,\n },\n };\n const preview: GenerationJob = {\n id,\n project_id: project,\n provider,\n adapter_version: adapterVersion,\n source_mode: 'lineage_reroll',\n root_asset_id: snapshot.root_asset_id,\n prompt,\n expected_output_count: 1,\n status: 'planned',\n output_dir: '.asset-scratch',\n handoff,\n created_at: timestamp,\n updated_at: timestamp,\n inputs: [input],\n outputs: [],\n receipts: [{\n id: `${id}:receipt:plan:preview`,\n job_id: id,\n receipt_type: 'plan',\n status: 'ok',\n command: 'reroll plan',\n payload: { prompt, expected_output_count: 1, lineage: handoff.lineage, reroll_request_id: request.id },\n created_at: timestamp,\n }],\n };\n if (fields.dryRun) return { ok: true, command: 'generate image plan', project, dryRun: true, wouldWrite: true, job: preview };\n const database = lineageDb();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(`\n insert into generation_jobs (\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at\n ) values (?, ?, ?, ?, 'lineage_reroll', ?, ?, 1, 'planned', ?, ?, ?, ?)\n `).run(id, project, provider, adapterVersion, snapshot.root_asset_id, prompt, '.asset-scratch', JSON.stringify(handoff), timestamp, timestamp);\n database.prepare('insert into generation_job_inputs (id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json) values (?, ?, ?, ?, ?, ?, ?, ?, ?)')\n .run(input.id, id, project, input.asset_id, input.root_asset_id, input.role, input.position, input.selection_strategy, JSON.stringify(input.selection_snapshot));\n insertReceipt(database, id, 'plan', 'reroll plan', preview.receipts[0].payload);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, command: 'generate image plan', project, job: loadGenerationJob(database, project, id) };\n } finally {\n database.close();\n }\n}\n\nfunction parentForOutput(job: GenerationJob, outputIndex: number): string {\n const inputs = job.inputs.filter(input => input.role === 'lineage_next_base');\n if (inputs.length === 0) throw new GenerationReceiptError('Generation job has no lineage_next_base input');\n if (inputs.length === 1) return inputs[0].asset_id;\n if (job.expected_output_count % inputs.length !== 0) throw new GenerationReceiptError('Generation job has invalid parent mapping');\n return inputs[Math.floor(outputIndex / (job.expected_output_count / inputs.length))]?.asset_id || inputs[inputs.length - 1].asset_id;\n}\n\nfunction parentInputs(job: GenerationJob): GenerationJobInput[] {\n const inputs = job.inputs.filter(input => input.role === 'lineage_next_base');\n if (inputs.length === 0) throw new GenerationReceiptError('Generation job has no lineage_next_base input');\n return inputs;\n}\n\nfunction parentFilesFor(job: GenerationJob, parentFiles: Record<string, string[]>): Array<{ file: string; parentAssetId: string }> {\n const inputs = parentInputs(job);\n const expectedPerParent = job.expected_output_count / inputs.length;\n if (!Number.isInteger(expectedPerParent)) throw new GenerationReceiptError('Generation job has invalid parent mapping');\n const allowedParents = new Set(inputs.map(input => input.asset_id));\n const seenParents = new Set<string>();\n const mapped: Array<{ file: string; parentAssetId: string }> = [];\n for (const parentAssetId of Object.keys(parentFiles)) {\n if (!allowedParents.has(parentAssetId)) throw new GenerationReceiptError(`Unknown generation parent mapping: ${parentAssetId}`);\n if (seenParents.has(parentAssetId)) throw new GenerationReceiptError(`Duplicate generation parent mapping: ${parentAssetId}`);\n seenParents.add(parentAssetId);\n }\n for (const input of inputs) {\n const files = (parentFiles[input.asset_id] || []).map(file => file.trim()).filter(Boolean);\n if (files.length === 0) throw new GenerationReceiptError(`Missing generation parent mapping for ${input.asset_id}`);\n if (files.length !== expectedPerParent) throw new GenerationReceiptError(`Parent ${input.asset_id} requires ${expectedPerParent} output file${expectedPerParent === 1 ? '' : 's'}, received ${files.length}`);\n for (const file of files) mapped.push({ file, parentAssetId: input.asset_id });\n }\n return mapped;\n}\n\nfunction orderedFilesFor(job: GenerationJob, files: string[]): Array<{ file: string; parentAssetId: string }> {\n return files.map((file, index) => ({ file, parentAssetId: parentForOutput(job, index) }));\n}\n\nexport function inspectImageGeneration(project = defaultProject, jobIdValue: string): GenerationInspectResponse {\n if (!jobIdValue) throw new GenerationReceiptError('Missing --job-id');\n const database = lineageDb();\n try {\n return { ok: true, command: 'generate image inspect', project, job: loadGenerationJob(database, project, jobIdValue) };\n } finally {\n database.close();\n }\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const rel = relative(parent, child);\n return Boolean(rel) && !rel.startsWith('..') && !rel.startsWith('/');\n}\n\nfunction resolveScratchFile(file: string): { relativePath: string; checksum: string; size: number; contentType: string; assetId: string } {\n const scratchRoot = resolve(repoRoot, '.asset-scratch');\n const candidate = file.startsWith('.asset-scratch/') || resolve(file).startsWith(scratchRoot)\n ? resolve(repoRoot, file)\n : resolve(scratchRoot, file);\n if (!isPathInside(candidate, scratchRoot)) throw new GenerationReceiptError(`Import file must be under .asset-scratch: ${file}`);\n if (!existsSync(candidate)) throw new GenerationReceiptError(`Missing import file: ${file}`, 404);\n const realScratchRoot = realpathSync(scratchRoot);\n const realCandidate = realpathSync(candidate);\n if (!isPathInside(realCandidate, realScratchRoot)) throw new GenerationReceiptError(`Import file must be under .asset-scratch: ${file}`);\n const stats = statSync(candidate);\n if (!stats.isFile()) throw new GenerationReceiptError(`Import path is not a file: ${file}`);\n const checksum = fileSha256(candidate);\n return {\n relativePath: relative(scratchRoot, candidate),\n checksum,\n size: stats.size,\n contentType: contentTypeFor(candidate),\n assetId: `local-${checksum.slice(0, 12)}`,\n };\n}\n\nexport function importImageGenerationOutputs(project = defaultProject, fields: { jobId: string; files?: string[]; parentFiles?: Record<string, string[]>; confirmWrite: boolean }): GenerationImportResponse {\n if (!fields.jobId) throw new GenerationReceiptError('Missing --job-id');\n if (!fields.confirmWrite) throw new GenerationReceiptError('Generation import requires --confirm-write');\n const database = lineageDb();\n let job: GenerationJob;\n try {\n job = loadGenerationJob(database, project, fields.jobId);\n } finally {\n database.close();\n }\n if (job.status !== 'planned') throw new GenerationReceiptError(`Generation job is not importable from status: ${job.status}`);\n const hasExplicitParentFiles = Boolean(fields.parentFiles && Object.keys(fields.parentFiles).length > 0);\n const hasOrderedFiles = Boolean(fields.files && fields.files.map(file => file.trim()).filter(Boolean).length > 0);\n if (hasExplicitParentFiles && hasOrderedFiles) throw new GenerationReceiptError('Use --files or --parent-files, not both');\n const parentFileRows = hasExplicitParentFiles\n ? parentFilesFor(job, fields.parentFiles || {})\n : orderedFilesFor(job, (fields.files || []).map(file => file.trim()).filter(Boolean));\n if (parentFileRows.length === 0) throw new GenerationReceiptError('Generation import requires --files or --parent-files');\n if (parentFileRows.length !== job.expected_output_count) {\n throw new GenerationReceiptError(`Output count mismatch: expected ${job.expected_output_count}, received ${parentFileRows.length}`);\n }\n const resolved = parentFileRows.map(row => ({ ...resolveScratchFile(row.file), parentAssetId: row.parentAssetId }));\n const uniquePaths = new Set(resolved.map(file => file.relativePath));\n if (uniquePaths.size !== resolved.length) throw new GenerationReceiptError('Generation import files must be unique');\n indexLineageAssets(project);\n const writeDb = lineageDb();\n try {\n const timestamp = nowIso();\n writeDb.exec('BEGIN IMMEDIATE');\n try {\n for (const [index, file] of resolved.entries()) {\n const assetRow = writeDb.prepare('select id from assets where project_id = ? and id = ?').get(project, file.assetId);\n if (!assetRow) throw new GenerationReceiptError(`Indexed local asset was not found: ${file.relativePath}`);\n const outputId = `${fields.jobId}:output:${index}`;\n writeDb.prepare(`insert into generation_job_outputs (\n id, job_id, project_id, output_index, file_path, checksum_sha256, size_bytes, content_type, imported_asset_id, parent_asset_id, imported_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(outputId, fields.jobId, project, index, file.relativePath, file.checksum, file.size, file.contentType, file.assetId, file.parentAssetId, timestamp);\n writeDb.prepare(`insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?) on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing`)\n .run(`${project}:${file.parentAssetId}:derived_from:${file.assetId}`, project, file.parentAssetId, file.assetId, timestamp);\n }\n writeDb.prepare(`\n update generation_jobs\n set status = 'imported', imported_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, timestamp, project, fields.jobId);\n insertReceipt(writeDb, fields.jobId, 'import', 'generate image import', {\n mapping_strategy: hasExplicitParentFiles ? 'explicit_parent_files' : 'ordered_per_base',\n files: resolved.map((file, index) => ({ output_index: index, file_path: file.relativePath, imported_asset_id: file.assetId, parent_asset_id: file.parentAssetId })),\n selection_reset: { root_asset_id: job.root_asset_id, cleared: true },\n });\n writeDb.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, job.root_asset_id);\n writeDb.exec('COMMIT');\n } catch (error) {\n writeDb.exec('ROLLBACK');\n throw error;\n }\n const importedJob = loadGenerationJob(writeDb, project, fields.jobId);\n return { ok: true, command: 'generate image import', project, job: importedJob, imported: importedJob.outputs };\n } finally {\n writeDb.close();\n }\n}\n\nexport function importImageRerollOutput(project = defaultProject, fields: { jobId: string; file: string; confirmWrite: boolean }): GenerationImportResponse {\n if (!fields.jobId) throw new GenerationReceiptError('Missing --job-id');\n if (!fields.confirmWrite) throw new GenerationReceiptError('Generation import requires --confirm-write');\n const database = lineageDb();\n let job: GenerationJob;\n try {\n job = loadGenerationJob(database, project, fields.jobId);\n } finally {\n database.close();\n }\n if (job.status !== 'planned') throw new GenerationReceiptError(`Generation job is not importable from status: ${job.status}`);\n if (job.source_mode !== 'lineage_reroll') throw new GenerationReceiptError(`Generation job is not a re-roll job: ${job.source_mode}`);\n const target = job.inputs.filter(input => input.role === 'reroll_target');\n if (target.length !== 1) throw new GenerationReceiptError('Re-roll import requires exactly one reroll_target input');\n const resolved = resolveScratchFile(fields.file);\n indexLineageAssets(project);\n const writeDb = lineageDb();\n try {\n const timestamp = nowIso();\n writeDb.exec('BEGIN IMMEDIATE');\n try {\n const assetRow = writeDb.prepare('select id from assets where project_id = ? and id = ?').get(project, resolved.assetId);\n if (!assetRow) throw new GenerationReceiptError(`Indexed local asset was not found: ${resolved.relativePath}`);\n const outputId = `${fields.jobId}:output:0`;\n writeDb.prepare(`insert into generation_job_outputs (\n id, job_id, project_id, output_index, file_path, checksum_sha256, size_bytes, content_type, imported_asset_id, parent_asset_id, imported_at\n ) values (?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?)`).run(outputId, fields.jobId, project, resolved.relativePath, resolved.checksum, resolved.size, resolved.contentType, resolved.assetId, target[0].asset_id, timestamp);\n writeDb.prepare(`\n update generation_jobs\n set status = 'imported', imported_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, timestamp, project, fields.jobId);\n insertReceipt(writeDb, fields.jobId, 'import', 'reroll import', {\n file: { output_index: 0, file_path: resolved.relativePath, imported_asset_id: resolved.assetId, parent_asset_id: target[0].asset_id },\n reroll: { root_asset_id: job.root_asset_id, node_asset_id: target[0].asset_id },\n });\n writeDb.exec('COMMIT');\n } catch (error) {\n writeDb.exec('ROLLBACK');\n throw error;\n }\n recordLineageRerollAttempt(project, {\n rootAssetId: job.root_asset_id,\n nodeAssetId: target[0].asset_id,\n assetId: resolved.assetId,\n prompt: job.prompt,\n generationJobId: fields.jobId,\n filePath: resolved.relativePath,\n checksumSha256: resolved.checksum,\n confirmWrite: true,\n });\n const importedJob = loadGenerationJob(writeDb, project, fields.jobId);\n return { ok: true, command: 'generate image import', project, job: importedJob, imported: importedJob.outputs };\n } finally {\n writeDb.close();\n }\n}\n", "import { defaultProject } from './assetCore';\nimport { lineageDb, nowIso } from './assetLineageDb';\nimport { loadGenerationJob } from './generationReceipts';\nimport type { GenerationJobListResponse } from '../shared/types';\n\nexport function listImageGenerationJobs(\n project = defaultProject,\n fields: { assetId?: string; rootAssetId?: string; limit?: number } = {}\n): GenerationJobListResponse {\n const clauses = ['job.project_id = ?'];\n const params: string[] = [project];\n if (fields.rootAssetId) {\n clauses.push('job.root_asset_id = ?');\n params.push(fields.rootAssetId);\n }\n if (fields.assetId) {\n clauses.push('(input.asset_id = ? or output.imported_asset_id = ? or output.parent_asset_id = ?)');\n params.push(fields.assetId, fields.assetId, fields.assetId);\n }\n const limit = Math.max(1, Math.min(50, Number.isInteger(fields.limit) ? Number(fields.limit) : 12));\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select distinct job.id\n from generation_jobs job\n left join generation_job_inputs input on input.job_id = job.id\n left join generation_job_outputs output on output.job_id = job.id\n where ${clauses.join(' and ')}\n order by job.created_at desc, job.id desc\n limit ?\n `).all(...params, limit) as Array<{ id: string }>;\n return { ok: true, command: 'generate image jobs', project, jobs: rows.map(row => loadGenerationJob(database, project, row.id)), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n", "import { createHash } from 'node:crypto';\nimport { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, posix } from 'node:path';\nimport { gunzipSync } from 'node:zlib';\nimport { defaultProject, repoRoot } from './assetCore';\nimport { linkLineageAssets, updateLineageLayout, updateSelectedAsset } from './assetLineage';\nimport { lineageDb, nowIso } from './assetLineageDb';\nimport { archiveLineageWorkspace, createLineageWorkspace, isLineageWorkspaceError, lineageWorkspaceId } from './assetLineageWorkspaces';\nimport { fileSha256 } from './localReview';\n\nconst demoWorkspaceTitle = 'Demo: Content iteration tree';\nconst demoWorkspaceNotes = 'Repeatable sample lineage for demos and onboarding. Archive it when reviewing real work.';\nconst demoBasePath = ['lineage-demo', '2026-06-lineage-demo'];\nconst swissifierManifestPath = join(repoRoot, 'fixtures', defaultProject, 'lineage', 'swissifier-rich-demo.json');\n\ninterface SwissifierManifestAsset {\n asset_id: string;\n file: string;\n title: string;\n channel: string;\n status: string;\n checksum_sha256: string;\n size_bytes: number;\n content_type: string;\n position: { x: number; y: number };\n}\n\ninterface SwissifierManifestRerollAttempt {\n node_asset_id: string;\n file: string;\n title: string;\n prompt: string;\n generation_job_id: string;\n checksum_sha256: string;\n size_bytes: number;\n content_type: string;\n attempt_index: number;\n current?: boolean;\n}\n\ninterface SwissifierManifest {\n id: string;\n title: string;\n notes: string;\n campaign: string;\n audience: string;\n media: {\n target_dir: string;\n source_env: string;\n source_hint: string;\n download?: { file: string; url: string; sha256: string; size_bytes: number };\n };\n root_asset_id: string;\n selected_asset_ids: string[];\n assets: SwissifierManifestAsset[];\n edges: Array<{ parent: string; child: string }>;\n reroll_attempts?: SwissifierManifestRerollAttempt[];\n}\n\nconst demoAssets = [\n { key: 'root', channel: 'linkedin', file: 'demo-root.svg', label: 'Initial Demo Concept', fill: '#f6fbfb', stroke: '#0b7f88' },\n { key: 'hookA', channel: 'tiktok', file: 'demo-hook-a-v01.svg', label: 'Hook A v01', fill: '#fff8e6', stroke: '#9a6a00' },\n { key: 'hookB', channel: 'linkedin', file: 'demo-workflow-v01.svg', label: 'Workflow v01', fill: '#eff7ff', stroke: '#2166a5' },\n { key: 'hookC', channel: 'linkedin', file: 'demo-founder-note-v01.svg', label: 'Founder Note v01', fill: '#f6efff', stroke: '#7653a6' },\n { key: 'hookA2', channel: 'tiktok', file: 'demo-hook-a-v02.svg', label: 'Hook A v02', fill: '#fff2cc', stroke: '#9a6a00' },\n { key: 'hookA3', channel: 'tiktok', file: 'demo-before-after-v02.svg', label: 'Before / After v02', fill: '#fff2cc', stroke: '#9a6a00' },\n { key: 'hookB2', channel: 'linkedin', file: 'demo-workflow-v02.svg', label: 'Workflow v02', fill: '#e6f3ff', stroke: '#2166a5' },\n { key: 'hookB3', channel: 'linkedin', file: 'demo-product-v02.svg', label: 'Product v02', fill: '#e6f3ff', stroke: '#2166a5' },\n { key: 'winner', channel: 'linkedin', file: 'demo-product-v03.svg', label: 'Selected Product v03', fill: '#eaf8ef', stroke: '#2e7d4f' },\n { key: 'alt', channel: 'tiktok', file: 'demo-action-v03.svg', label: 'Action v03', fill: '#fff2cc', stroke: '#9a6a00' },\n] as const;\n\nconst demoEdges = [\n ['root', 'hookA'],\n ['root', 'hookB'],\n ['root', 'hookC'],\n ['hookA', 'hookA2'],\n ['hookA', 'hookA3'],\n ['hookB', 'hookB2'],\n ['hookB', 'hookB3'],\n ['hookB3', 'winner'],\n ['hookA3', 'alt'],\n] as const;\n\nconst demoPositions = new Map<string, { x: number; y: number }>([\n ['root', { x: 0, y: 160 }],\n ['hookA', { x: 340, y: 0 }],\n ['hookB', { x: 340, y: 190 }],\n ['hookC', { x: 340, y: 380 }],\n ['hookA2', { x: 700, y: -80 }],\n ['hookA3', { x: 700, y: 80 }],\n ['hookB2', { x: 700, y: 230 }],\n ['hookB3', { x: 700, y: 390 }],\n ['winner', { x: 1060, y: 350 }],\n ['alt', { x: 1060, y: 80 }],\n]);\n\nfunction demoProjectDir(project: string): string {\n return join(repoRoot, '.asset-scratch', ...demoBasePath, project);\n}\n\nfunction demoRelativePath(project: string, asset: typeof demoAssets[number]): string {\n return join(...demoBasePath, project, asset.channel, asset.file);\n}\n\nfunction demoFilePath(project: string, asset: typeof demoAssets[number]): string {\n return join(demoProjectDir(project), asset.channel, asset.file);\n}\n\nfunction swissifierManifest(): SwissifierManifest {\n return JSON.parse(readFileSync(swissifierManifestPath, 'utf8')) as SwissifierManifest;\n}\n\nfunction swissifierRelativePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset): string {\n return join(manifest.media.target_dir, asset.file);\n}\n\nfunction swissifierFilePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset): string {\n return join(repoRoot, '.asset-scratch', swissifierRelativePath(manifest, asset));\n}\n\nfunction swissifierRerollRelativePath(manifest: SwissifierManifest, attempt: SwissifierManifestRerollAttempt): string {\n return join(manifest.media.target_dir, 'reroll-attempts', attempt.file);\n}\n\nfunction swissifierRerollFilePath(manifest: SwissifierManifest, attempt: SwissifierManifestRerollAttempt): string {\n return join(repoRoot, '.asset-scratch', swissifierRerollRelativePath(manifest, attempt));\n}\n\nfunction swissifierRerollFixturePath(attempt: SwissifierManifestRerollAttempt): string {\n return join(dirname(swissifierManifestPath), 'swissifier-rerolls', attempt.file);\n}\n\nfunction swissifierSourcePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset, sourceDir: string): string | null {\n const direct = join(sourceDir, asset.file);\n if (existsSync(direct)) return direct;\n const nested = join(sourceDir, manifest.media.target_dir, asset.file);\n return existsSync(nested) ? nested : null;\n}\n\nfunction swissifierMediaState(manifest: SwissifierManifest) {\n const missing: string[] = [];\n const invalid: string[] = [];\n for (const asset of manifest.assets) {\n const relativePath = swissifierRelativePath(manifest, asset);\n const path = swissifierFilePath(manifest, asset);\n if (!existsSync(path)) {\n missing.push(relativePath);\n continue;\n }\n if (fileSha256(path) !== asset.checksum_sha256) invalid.push(relativePath);\n }\n return { invalid, missing };\n}\n\nfunction sha256Hex(input: Buffer | string): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nfunction safeTarEntryName(rawName: string): string {\n const stripped = rawName.replace(/\\0.*$/, '').replace(/^\\.\\//, '');\n if (!stripped || stripped === '.') return '';\n if (stripped.includes('\\\\') || stripped.startsWith('/') || /^[A-Za-z]:/.test(stripped)) {\n throw new Error(`Unsafe Swissifier media archive path: ${rawName}`);\n }\n const normalized = posix.normalize(stripped);\n if (!normalized || normalized === '.' || normalized.startsWith('../') || normalized === '..') {\n throw new Error(`Unsafe Swissifier media archive path: ${rawName}`);\n }\n return normalized;\n}\n\nfunction tarOctal(header: Buffer, start: number, length: number): number {\n const raw = header.toString('utf8', start, start + length).replace(/\\0.*$/, '').trim();\n if (!raw) return 0;\n if (!/^[0-7]+$/.test(raw)) throw new Error(`Invalid Swissifier media archive size: ${raw}`);\n return Number.parseInt(raw, 8);\n}\n\nfunction tarName(header: Buffer): string {\n const name = header.toString('utf8', 0, 100).replace(/\\0.*$/, '');\n const prefix = header.toString('utf8', 345, 500).replace(/\\0.*$/, '');\n return prefix ? `${prefix}/${name}` : name;\n}\n\nfunction isAppleDoubleEntry(name: string): boolean {\n return name === '._.' || name.startsWith('._') || name.includes('/._');\n}\n\nfunction extractSwissifierMediaArchive(archive: Buffer, manifest: SwissifierManifest, destination: string) {\n const expected = new Map(manifest.assets.map(asset => [asset.file, asset]));\n const extracted = new Set<string>();\n const body = gunzipSync(archive);\n let offset = 0;\n while (offset + 512 <= body.length) {\n const header = body.subarray(offset, offset + 512);\n offset += 512;\n if (header.every(byte => byte === 0)) break;\n const typeflag = header.toString('utf8', 156, 157);\n const rawName = tarName(header);\n const name = safeTarEntryName(rawName);\n const size = tarOctal(header, 124, 12);\n const nextOffset = offset + Math.ceil(size / 512) * 512;\n if (nextOffset > body.length) throw new Error(`Truncated Swissifier media archive entry: ${rawName}`);\n if (!name || typeflag === '5') {\n offset = nextOffset;\n continue;\n }\n if (typeflag === 'x' || typeflag === 'g') {\n offset = nextOffset;\n continue;\n }\n if (isAppleDoubleEntry(name)) {\n offset = nextOffset;\n continue;\n }\n if (typeflag && typeflag !== '0') throw new Error(`Unsupported Swissifier media archive entry type for ${name}`);\n const directName = name.startsWith(`${manifest.media.target_dir}/`) ? name.slice(manifest.media.target_dir.length + 1) : name;\n const asset = expected.get(directName);\n if (!asset) throw new Error(`Unexpected Swissifier media archive entry: ${name}`);\n if (size !== asset.size_bytes) throw new Error(`Unexpected Swissifier media archive size for ${name}`);\n const file = body.subarray(offset, offset + size);\n const actualSha = sha256Hex(file);\n if (actualSha !== asset.checksum_sha256) throw new Error(`Checksum mismatch for Swissifier media archive entry: ${name}`);\n const target = join(destination, directName);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, file);\n extracted.add(directName);\n offset = nextOffset;\n }\n const missing = manifest.assets.map(asset => asset.file).filter(file => !extracted.has(file));\n if (missing.length) throw new Error(`Swissifier media archive missing ${missing.length} expected file${missing.length === 1 ? '' : 's'}`);\n return { extracted: extracted.size };\n}\n\nasync function downloadBuffer(url: string, maxBytes: number): Promise<Buffer> {\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Swissifier media download failed with HTTP ${response.status}`);\n const contentLength = Number(response.headers.get('content-length') || 0);\n if (contentLength > maxBytes) throw new Error(`Swissifier media download is too large: ${contentLength} bytes`);\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxBytes) throw new Error(`Swissifier media download is too large: ${buffer.length} bytes`);\n return buffer;\n}\n\nfunction missingDemoMedia(project: string): string[] {\n return demoAssets\n .filter(asset => !existsSync(demoFilePath(project, asset)))\n .map(asset => demoRelativePath(project, asset));\n}\n\nexport function demoSeedMediaStatus(project = defaultProject) {\n const missing = missingDemoMedia(project);\n const present = demoAssets.length - missing.length;\n return {\n ok: true,\n media_root: join(repoRoot, '.asset-scratch'),\n present,\n total: demoAssets.length,\n missing,\n fixture_present: present,\n fixture_total: demoAssets.length,\n fixture_missing: missing,\n };\n}\n\nexport function swissifierRichDemoMediaStatus(project = defaultProject) {\n const manifest = swissifierManifest();\n const { invalid, missing } = swissifierMediaState(manifest);\n const present = manifest.assets.length - missing.length - invalid.length;\n return {\n ok: true,\n demo_id: manifest.id,\n project,\n media_root: join(repoRoot, '.asset-scratch'),\n media_target: manifest.media.target_dir,\n download_available: Boolean(manifest.media.download),\n download_file: manifest.media.download?.file,\n download_sha256: manifest.media.download?.sha256,\n download_url: manifest.media.download?.url,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n present,\n total: manifest.assets.length,\n missing,\n invalid,\n fixture_present: present,\n fixture_total: manifest.assets.length,\n fixture_missing: [...missing, ...invalid],\n };\n}\n\nexport async function downloadSwissifierRichDemoMedia(project = defaultProject, fields: { confirmWrite: boolean; sourceUrl?: string; expectedSha256?: string } = { confirmWrite: false }) {\n const manifest = swissifierManifest();\n const download = manifest.media.download;\n if (!download) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n download_available: false,\n restored: 0,\n total: manifest.assets.length,\n };\n }\n const sourceUrl = fields.sourceUrl || download.url;\n const expectedSha256 = fields.expectedSha256 || download.sha256;\n const maxBytes = Math.max(download.size_bytes + 1024 * 1024, download.size_bytes * 1.1);\n const archive = await downloadBuffer(sourceUrl, maxBytes);\n const archiveSha256 = sha256Hex(archive);\n if (archiveSha256 !== expectedSha256) throw new Error(`Swissifier media download checksum mismatch: expected ${expectedSha256}, got ${archiveSha256}`);\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: true as const,\n download_available: true,\n download_file: download.file,\n download_url: sourceUrl,\n archive_sha256: archiveSha256,\n restored: 0,\n total: manifest.assets.length,\n would_restore: manifest.assets.length,\n };\n }\n const sourceDir = mkdtempSync(join(tmpdir(), 'lineage-swissifier-media-'));\n try {\n const extracted = extractSwissifierMediaArchive(archive, manifest, sourceDir);\n const restored = restoreSwissifierRichDemoMedia(project, { confirmWrite: true, sourceDir });\n return {\n ...restored,\n download_available: true,\n download_file: download.file,\n download_url: sourceUrl,\n archive_sha256: archiveSha256,\n extracted: extracted.extracted,\n media_status: swissifierRichDemoMediaStatus(project),\n };\n } finally {\n rmSync(sourceDir, { force: true, recursive: true });\n }\n}\n\nexport function restoreDemoSeedMedia(project = defaultProject, fields: { confirmWrite: boolean } = { confirmWrite: false }) {\n const missing = new Set(missingDemoMedia(project));\n if (fields.confirmWrite) {\n for (const asset of demoAssets) {\n if (missing.has(demoRelativePath(project, asset))) writeDemoFile(project, asset);\n }\n }\n return {\n ok: true as const,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: fields.confirmWrite ? missing.size : 0,\n total: demoAssets.length,\n would_restore: fields.confirmWrite ? 0 : missing.size,\n missing: Array.from(missing),\n };\n}\n\nexport function restoreSwissifierRichDemoMedia(project = defaultProject, fields: { confirmWrite: boolean; sourceDir?: string } = { confirmWrite: false }) {\n const manifest = swissifierManifest();\n const before = swissifierMediaState(manifest);\n const sourceDir = fields.sourceDir || process.env[manifest.media.source_env];\n if (!sourceDir) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: 0,\n total: manifest.assets.length,\n would_restore: 0,\n source_required: true,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n missing: before.missing,\n invalid: before.invalid,\n unavailable: [...before.missing, ...before.invalid],\n };\n }\n const unavailable: string[] = [];\n const copyable: Array<{ asset: SwissifierManifestAsset; source: string }> = [];\n const wanted = new Set([...before.missing, ...before.invalid]);\n for (const asset of manifest.assets) {\n const relativePath = swissifierRelativePath(manifest, asset);\n if (!wanted.has(relativePath)) continue;\n const source = swissifierSourcePath(manifest, asset, sourceDir);\n if (!source || fileSha256(source) !== asset.checksum_sha256) {\n unavailable.push(relativePath);\n continue;\n }\n copyable.push({ asset, source });\n }\n if (fields.confirmWrite) {\n for (const item of copyable) {\n const target = swissifierFilePath(manifest, item.asset);\n mkdirSync(dirname(target), { recursive: true });\n copyFileSync(item.source, target);\n }\n }\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: fields.confirmWrite ? copyable.length : 0,\n total: manifest.assets.length,\n would_restore: fields.confirmWrite ? 0 : copyable.length,\n source_required: false,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n missing: before.missing,\n invalid: before.invalid,\n unavailable,\n };\n}\n\nfunction svg(label: string, fill: string, stroke: string): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\">\n <rect width=\"1200\" height=\"675\" rx=\"42\" fill=\"${fill}\"/>\n <rect x=\"60\" y=\"60\" width=\"1080\" height=\"555\" rx=\"34\" fill=\"#ffffff\" stroke=\"${stroke}\" stroke-width=\"12\"/>\n <text x=\"600\" y=\"310\" text-anchor=\"middle\" font-family=\"Inter, Arial, sans-serif\" font-size=\"68\" font-weight=\"800\" fill=\"#1f2a33\">${label}</text>\n <text x=\"600\" y=\"390\" text-anchor=\"middle\" font-family=\"Inter, Arial, sans-serif\" font-size=\"34\" font-weight=\"700\" fill=\"${stroke}\">Lineage demo lineage</text>\n</svg>\n`;\n}\n\nfunction assetIdFor(asset: typeof demoAssets[number]): string {\n return `local-${createHash('sha256').update(svg(asset.label, asset.fill, asset.stroke)).digest('hex').slice(0, 12)}`;\n}\n\nfunction demoAssetIds(): Record<string, string> {\n return Object.fromEntries(demoAssets.map(asset => [asset.key, assetIdFor(asset)]));\n}\n\nfunction writeDemoFile(project: string, asset: typeof demoAssets[number]): void {\n const path = demoFilePath(project, asset);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, svg(asset.label, asset.fill, asset.stroke));\n}\n\nfunction writeDemoFiles(project: string): Record<string, string> {\n const ids = demoAssetIds();\n for (const asset of demoAssets) writeDemoFile(project, asset);\n return ids;\n}\n\nfunction swissifierRerollAsset(attempt: SwissifierManifestRerollAttempt) {\n const source = swissifierRerollFixturePath(attempt);\n if (!existsSync(source)) throw new Error(`Missing Swissifier re-roll fixture media: ${attempt.file}`);\n const body = readFileSync(source);\n if (body.length !== attempt.size_bytes) throw new Error(`Unexpected Swissifier re-roll fixture size for ${attempt.file}`);\n const checksumSha256 = sha256Hex(body);\n if (checksumSha256 !== attempt.checksum_sha256) throw new Error(`Checksum mismatch for Swissifier re-roll fixture: ${attempt.file}`);\n return {\n assetId: `local-${checksumSha256.slice(0, 12)}`,\n checksumSha256,\n sizeBytes: body.length,\n };\n}\n\nfunction writeSwissifierRerollFiles(manifest: SwissifierManifest) {\n for (const attempt of manifest.reroll_attempts || []) {\n swissifierRerollAsset(attempt);\n const target = swissifierRerollFilePath(manifest, attempt);\n mkdirSync(dirname(target), { recursive: true });\n copyFileSync(swissifierRerollFixturePath(attempt), target);\n }\n}\n\nfunction upsertDemoAssets(project: string, ids: Record<string, string>) {\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n const assetStatement = database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, 'local', ?, null, ?, 'image', ?, 'planned', ?, '2026-06-lineage-demo', 'demo', ?, 'image/svg+xml', ?, ?, ?)\n on conflict(id) do update set\n project_id = excluded.project_id, source = excluded.source, local_path = excluded.local_path, checksum_sha256 = excluded.checksum_sha256,\n media_type = excluded.media_type, title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `);\n const reviewStatement = database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `);\n for (const asset of demoAssets) {\n const body = svg(asset.label, asset.fill, asset.stroke);\n assetStatement.run(\n ids[asset.key],\n project,\n demoRelativePath(project, asset),\n createHash('sha256').update(body).digest('hex'),\n asset.label,\n asset.channel,\n Buffer.byteLength(body),\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(ids[asset.key], timestamp);\n }\n } finally {\n database.close();\n }\n return { catalog: 0, local: demoAssets.length, total: demoAssets.length };\n}\n\nfunction upsertSwissifierAssets(project: string, manifest: SwissifierManifest) {\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n const assetStatement = database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, 'local', ?, null, ?, 'image', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n project_id = excluded.project_id, source = excluded.source, local_path = excluded.local_path, checksum_sha256 = excluded.checksum_sha256,\n media_type = excluded.media_type, title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `);\n const reviewStatement = database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `);\n for (const asset of manifest.assets) {\n assetStatement.run(\n asset.asset_id,\n project,\n swissifierRelativePath(manifest, asset),\n asset.checksum_sha256,\n asset.title,\n asset.status,\n asset.channel,\n manifest.campaign,\n manifest.audience,\n asset.size_bytes,\n asset.content_type,\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(asset.asset_id, timestamp);\n }\n for (const attempt of manifest.reroll_attempts || []) {\n const generated = swissifierRerollAsset(attempt);\n assetStatement.run(\n generated.assetId,\n project,\n swissifierRerollRelativePath(manifest, attempt),\n generated.checksumSha256,\n attempt.title,\n 'planned',\n 'local',\n manifest.campaign,\n manifest.audience,\n generated.sizeBytes,\n attempt.content_type,\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(generated.assetId, timestamp);\n }\n } finally {\n database.close();\n }\n const attemptCount = manifest.reroll_attempts?.length || 0;\n return { catalog: 0, local: manifest.assets.length + attemptCount, total: manifest.assets.length + attemptCount };\n}\n\nfunction upsertSwissifierRerollAttempts(project: string, manifest: SwissifierManifest) {\n const attempts = manifest.reroll_attempts || [];\n if (attempts.length === 0) return { total: 0 };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n const nodes = new Set(attempts.map(attempt => attempt.node_asset_id));\n for (const nodeAssetId of nodes) {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, nodeAssetId);\n }\n const statement = database.prepare(`\n insert into asset_attempts (\n id, project_id, node_asset_id, asset_id, attempt_index, source, prompt, generation_job_id,\n file_path, checksum_sha256, created_at, promoted_at, is_current\n ) values (?, ?, ?, ?, ?, 'reroll', ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n asset_id = excluded.asset_id,\n source = excluded.source,\n prompt = excluded.prompt,\n generation_job_id = excluded.generation_job_id,\n file_path = excluded.file_path,\n checksum_sha256 = excluded.checksum_sha256,\n promoted_at = excluded.promoted_at,\n is_current = excluded.is_current\n `);\n for (const attempt of attempts) {\n const generated = swissifierRerollAsset(attempt);\n statement.run(\n `${project}:${attempt.node_asset_id}:attempt:${attempt.attempt_index}`,\n project,\n attempt.node_asset_id,\n generated.assetId,\n attempt.attempt_index,\n attempt.prompt,\n attempt.generation_job_id,\n swissifierRerollRelativePath(manifest, attempt),\n generated.checksumSha256,\n timestamp,\n timestamp,\n attempt.current ? 1 : 0\n );\n }\n for (const nodeAssetId of nodes) {\n const currentCount = database.prepare('select count(*) count from asset_attempts where project_id = ? and node_asset_id = ? and is_current = 1').get(project, nodeAssetId) as { count: number };\n if (currentCount.count === 0) {\n database.prepare(`\n update asset_attempts\n set is_current = 1, promoted_at = ?\n where id = (\n select id from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc\n limit 1\n )\n `).run(timestamp, project, nodeAssetId);\n }\n }\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n } finally {\n database.close();\n }\n return { total: attempts.length };\n}\n\nexport function seedDemoLineageWorkspace(project: string, fields: { activate?: boolean; confirmWrite: boolean }) {\n const ids = fields.confirmWrite ? writeDemoFiles(project) : demoAssetIds();\n const rootAssetId = ids.root;\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n root_asset_id: rootAssetId,\n workspace_id: lineageWorkspaceId(project, rootAssetId),\n files_dir: demoProjectDir(project),\n };\n }\n const summary = upsertDemoAssets(project, ids);\n for (const [parent, child] of demoEdges) {\n linkLineageAssets(project, { parentAssetId: ids[parent], childAssetId: ids[child], confirmWrite: true });\n }\n updateSelectedAsset(project, {\n assetId: ids.winner,\n confirmWrite: true,\n notes: 'Demo selected winner for the next variation.',\n rootAssetId,\n });\n updateLineageLayout(project, {\n confirmWrite: true,\n rootAssetId,\n positions: [...demoPositions].map(([key, position]) => ({ assetId: ids[key], ...position })),\n });\n const workspace = createLineageWorkspace(project, {\n activate: fields.activate !== false,\n confirmWrite: true,\n createdBy: 'system',\n notes: demoWorkspaceNotes,\n rootAssetId,\n title: demoWorkspaceTitle,\n }).workspace;\n return {\n ok: true as const,\n message: `Seeded ${demoWorkspaceTitle}`,\n files_dir: demoProjectDir(project),\n root_asset_id: rootAssetId,\n selected_asset_id: ids.winner,\n summary,\n workspace,\n };\n}\n\nexport function seedSwissifierRichDemoWorkspace(project: string, fields: { activate?: boolean; confirmWrite: boolean }) {\n const manifest = swissifierManifest();\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n demo_id: manifest.id,\n root_asset_id: manifest.root_asset_id,\n workspace_id: lineageWorkspaceId(project, manifest.root_asset_id),\n media_status: swissifierRichDemoMediaStatus(project),\n };\n }\n writeSwissifierRerollFiles(manifest);\n const summary = upsertSwissifierAssets(project, manifest);\n for (const edge of manifest.edges) {\n linkLineageAssets(project, { parentAssetId: edge.parent, childAssetId: edge.child, confirmWrite: true });\n }\n const reroll_attempts = upsertSwissifierRerollAttempts(project, manifest);\n updateSelectedAsset(project, {\n assetIds: manifest.selected_asset_ids,\n confirmWrite: true,\n maxSelections: manifest.selected_asset_ids.length,\n notes: 'Swissifier rich demo bases selected for the next variation.',\n rootAssetId: manifest.root_asset_id,\n });\n updateLineageLayout(project, {\n confirmWrite: true,\n rootAssetId: manifest.root_asset_id,\n positions: manifest.assets.map(asset => ({ assetId: asset.asset_id, ...asset.position })),\n });\n const workspace = createLineageWorkspace(project, {\n activate: fields.activate !== false,\n confirmWrite: true,\n createdBy: 'system',\n notes: manifest.notes,\n rootAssetId: manifest.root_asset_id,\n title: manifest.title,\n }).workspace;\n return {\n ok: true as const,\n message: `Seeded ${manifest.title}`,\n demo_id: manifest.id,\n media_status: swissifierRichDemoMediaStatus(project),\n root_asset_id: manifest.root_asset_id,\n selected_asset_ids: manifest.selected_asset_ids,\n reroll_attempts,\n summary,\n workspace,\n };\n}\n\nexport function archiveDemoLineageWorkspace(project: string, confirmWrite: boolean) {\n const ids = demoAssetIds();\n const rootAssetId = ids.root;\n let archived;\n try {\n archived = archiveLineageWorkspace(project, lineageWorkspaceId(project, rootAssetId), confirmWrite);\n } catch (error) {\n if (!isLineageWorkspaceError(error) || error.status !== 404) throw error;\n archived = { ok: true as const, message: 'No demo lineage workspace exists yet', workspace: null };\n }\n if (confirmWrite) rmSync(demoProjectDir(project), { force: true, recursive: true });\n return {\n ok: true as const,\n message: confirmWrite ? `Archived ${demoWorkspaceTitle}` : `Would archive ${demoWorkspaceTitle}`,\n files_dir: demoProjectDir(project),\n root_asset_id: rootAssetId,\n archived,\n };\n}\n", "import type express from 'express';\nimport {\n indexLineageAssets,\n} from './assetLineage';\nimport {\n activateLineageWorkspace,\n archiveLineageWorkspace,\n createLineageWorkspace,\n inspectLineageWorkspace,\n listLineageWorkspaces,\n updateLineageWorkspace,\n} from './assetLineageWorkspaces';\nimport {\n archiveDemoLineageWorkspace,\n demoSeedMediaStatus,\n downloadSwissifierRichDemoMedia,\n restoreDemoSeedMedia,\n restoreSwissifierRichDemoMedia,\n seedDemoLineageWorkspace,\n seedSwissifierRichDemoWorkspace,\n swissifierRichDemoMediaStatus,\n} from './assetLineageDemo';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function registerLineageWorkspaceRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/lineage-workspaces', asyncRoute((req, res) => {\n res.json(listLineageWorkspaces(projectFrom(req)));\n }));\n\n app.post('/api/lineage-workspaces', asyncRoute((req, res) => {\n const project = projectFrom(req);\n if (req.body.confirmWrite === true) indexLineageAssets(project);\n res.json(createLineageWorkspace(project, {\n rootAssetId: String(req.body.rootAssetId || ''),\n title: typeof req.body.title === 'string' ? req.body.title : undefined,\n status: req.body.status === 'paused' || req.body.status === 'archived' ? req.body.status : 'active',\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n createdBy: req.body.createdBy === 'agent' || req.body.createdBy === 'system' ? req.body.createdBy : 'human',\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/demo/seed', asyncRoute((req, res) => {\n res.json(seedDemoLineageWorkspace(projectFrom(req), {\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/demo/archive', asyncRoute((req, res) => {\n res.json(archiveDemoLineageWorkspace(projectFrom(req), req.body.confirmWrite === true));\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/seed', asyncRoute((req, res) => {\n res.json(seedSwissifierRichDemoWorkspace(projectFrom(req), {\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.get('/api/lineage-workspaces/demo/media', asyncRoute((req, res) => {\n res.json({ ok: true, status: demoSeedMediaStatus(projectFrom(req)) });\n }));\n\n app.get('/api/lineage-workspaces/demo/swissifier/media', asyncRoute((req, res) => {\n res.json({ ok: true, status: swissifierRichDemoMediaStatus(projectFrom(req)) });\n }));\n\n app.post('/api/lineage-workspaces/demo/media/restore', asyncRoute((req, res) => {\n res.json({ ok: true, result: restoreDemoSeedMedia(projectFrom(req), { confirmWrite: req.body.confirmWrite === true }) });\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/media/restore', asyncRoute((req, res) => {\n res.json({\n ok: true,\n result: restoreSwissifierRichDemoMedia(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n sourceDir: typeof req.body.sourceDir === 'string' ? req.body.sourceDir : undefined,\n }),\n });\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/media/download', asyncRoute(async (req, res) => {\n res.json({\n ok: true,\n result: await downloadSwissifierRichDemoMedia(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n }),\n });\n }));\n\n app.get('/api/lineage-workspaces/:workspaceId', asyncRoute((req, res) => {\n res.json({\n ok: true,\n project: projectFrom(req),\n workspace: inspectLineageWorkspace(projectFrom(req), req.params.workspaceId),\n });\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId', asyncRoute((req, res) => {\n res.json(updateLineageWorkspace(projectFrom(req), req.params.workspaceId, {\n title: typeof req.body.title === 'string' ? req.body.title : undefined,\n status: req.body.status === 'active' || req.body.status === 'paused' || req.body.status === 'archived' ? req.body.status : undefined,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n activate: req.body.activate === true,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId/activate', asyncRoute((req, res) => {\n res.json(activateLineageWorkspace(projectFrom(req), req.params.workspaceId, req.body.confirmWrite === true));\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId/archive', asyncRoute((req, res) => {\n res.json(archiveLineageWorkspace(projectFrom(req), req.params.workspaceId, req.body.confirmWrite === true));\n }));\n}\n"],
|
|
5
|
-
"mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
|
|
6
|
-
"names": ["express", "existsSync", "join", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "dirname", "join", "resolve", "existsSync", "statSync", "basename", "join", "repoRoot", "svg", "existsSync", "join", "basename", "statSync", "mkdirSync", "join", "require", "join", "mkdirSync", "join", "existsSync", "readFileSync", "dirname", "resolve", "svg", "escapeSvgText", "mkdirSync", "readdirSync", "localAssets", "localPreviewPath", "join", "mkdirSync", "resolve", "existsSync", "localAssets", "join", "
|
|
3
|
+
"sources": ["../src/server.ts", "../src/server/assetCore.ts", "../src/server/adapters/storage/s3StorageAdapter.ts", "../src/server/localReview.ts", "../src/server/assetLineageDb.ts", "../src/server/assetLedgerWorkflow.ts", "../src/server/assetLookup.ts", "../src/server/assetLineage.ts", "../src/server/assetLineageSelection.ts", "../src/server/assetLineageTasks.ts", "../src/server/agentClaims.ts", "../src/server/assetLineageWorkspaces.ts", "../src/server/lineageClaimGuards.ts", "../src/server/assetLineageHandoff.ts", "../src/server/assetLineageRemove.ts", "../src/server/assetLedger.ts", "../src/server/assetLedgerApi.ts", "../src/server/assetReviews.ts", "../src/server/assetReviewQueue.ts", "../src/server/assetReviewSets.ts", "../src/server/assetSelections.ts", "../src/server/agentClaimRoutes.ts", "../src/server/adapters/adapterSettings.ts", "../src/server/adapters/posting/bufferPostingAdapter.ts", "../src/server/adapters/adapterStatus.ts", "../src/server/adapters/posting/bufferPostingService.ts", "../src/server/contentPostHandoff.ts", "../src/server/contentBatches.ts", "../src/server/contentTargets.ts", "../src/server/adapters/adapterRoutes.ts", "../src/server/contentBatchRoutes.ts", "../src/server/contentBatchImport.ts", "../src/server/contentOpsQueue.ts", "../src/server/generationReceipts.ts", "../src/server/generationReceiptJobs.ts", "../src/server/lineageTaskRoutes.ts", "../src/server/assetLineageDemo.ts", "../src/server/lineageWorkspaceRoutes.ts"],
|
|
4
|
+
"sourcesContent": ["import express from 'express';\nimport multer from 'multer';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { archiveAsset, cleanupUploadedTemp, defaultProduct, deleteObjectGuarded, ensureUploadDir, isLineageAssetError, listAssets, listProjects, localPreviewPath, presignAsset, pullAsset, promoteAsset, repoRoot, uploadAsset, updatePlacement } from './server/assetCore';\nimport { isAssetLookupError, lookupAssets } from './server/assetLookup';\nimport {\n clearLineageRerollRequest,\n getLineageAttempts,\n getLineageChildren,\n getLineageNextAsset,\n getLineageSnapshot,\n indexLineageAssets,\n isLineageError,\n linkLineageAssets,\n listLineageRerollRequests,\n markLineageRerollRequest,\n promoteLineageAttempt,\n updateAssetReview,\n updateLineageLayout,\n updateSelectedAsset,\n} from './server/assetLineage';\nimport { getLineageBrief, linkSelectedLineageChild } from './server/assetLineageHandoff';\nimport { removeLineageNode } from './server/assetLineageRemove';\nimport { isLineageTaskError } from './server/assetLineageTasks';\nimport { isLineageWorkspaceError } from './server/assetLineageWorkspaces';\nimport { getLedgerPageFromQuery } from './server/assetLedgerApi';\nimport { isAssetReviewError, markAssetReview, markAssetReviewsFromRequestBody, requireApprovedLocalBackupPath, withLocalReviewMetadata } from './server/assetReviews';\nimport { getReviewQueue } from './server/assetReviewQueue';\nimport { isAssetReviewSetError } from './server/assetReviewSets';\nimport { assetSelectionRouter, isAssetSelectionError } from './server/assetSelections';\nimport { isAgentClaimError } from './server/agentClaims';\nimport { claimTokenFromRequest, registerAgentClaimRoutes } from './server/agentClaimRoutes';\nimport { registerAdapterRoutes } from './server/adapters/adapterRoutes';\nimport { isAdapterSettingsError } from './server/adapters/adapterSettings';\nimport { isPostingAdapterError } from './server/adapters/posting/bufferPostingService';\nimport { contentBatchRouter } from './server/contentBatchRoutes';\nimport { isContentBatchError } from './server/contentBatches';\nimport { listImageGenerationJobs } from './server/generationReceiptJobs';\nimport { isGenerationReceiptError } from './server/generationReceipts';\nimport { registerLineageTaskRoutes } from './server/lineageTaskRoutes';\nimport { registerLineageWorkspaceRoutes } from './server/lineageWorkspaceRoutes';\nimport type { AssetContentType, AssetReviewState, PlacementFields, PlacementStatus, UploadFields } from './shared/types';\nconst app = express();\nconst port = Number(process.env.PORT || 5173);\nconst host = process.env.HOST || 'lineage.localhost';\nconst isProduction = process.env.NODE_ENV === 'production';\nconst maxUploadBytes = Number(process.env.LINEAGE_MAX_UPLOAD_MB || 200) * 1024 * 1024;\nconst upload = multer({ dest: ensureUploadDir(), limits: { fileSize: maxUploadBytes } });\napp.use(express.json({ limit: '1mb' }));\nfunction projectFrom(input: { body?: Record<string, unknown>; query?: Record<string, unknown> }): string {\n const candidate = input.body?.project || input.body?.product || input.query?.project || input.query?.product;\n return typeof candidate === 'string' ? candidate : defaultProduct;\n}\n\nfunction asyncRoute(handler: (req: express.Request, res: express.Response) => Promise<void> | void): express.RequestHandler {\n return (req, res, next) => { Promise.resolve(handler(req, res)).catch(next); };\n}\napp.get('/api/projects', asyncRoute((_req, res) => { res.json({ projects: listProjects() }); }));\napp.get(\n '/api/assets',\n asyncRoute((req, res) => {\n const project = projectFrom(req);\n const snapshot = listAssets(project, {\n audience: typeof req.query.audience === 'string' ? req.query.audience : undefined,\n campaign: typeof req.query.campaign === 'string' ? req.query.campaign : undefined,\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n includeLive: req.query.live === 'true',\n page: Number(req.query.page || 1),\n pageSize: Number(req.query.pageSize || 10),\n placementStatus: typeof req.query.placementStatus === 'string' ? req.query.placementStatus : undefined,\n query: typeof req.query.q === 'string' ? req.query.q : undefined,\n source: typeof req.query.source === 'string' ? req.query.source : undefined,\n status: typeof req.query.status === 'string' ? req.query.status : undefined,\n type: typeof req.query.type === 'string' ? req.query.type : undefined,\n });\n res.json(withLocalReviewMetadata(project, snapshot));\n })\n);\napp.get('/api/ledger', asyncRoute((req, res) => { res.json(getLedgerPageFromQuery(projectFrom(req), req.query)); }));\napp.post('/api/assets/lookup', asyncRoute((req, res) => { res.json(lookupAssets(projectFrom(req), Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [])); }));\nregisterAdapterRoutes(app, projectFrom, asyncRoute);\nregisterAgentClaimRoutes(app, projectFrom, asyncRoute);\napp.use('/api/content', contentBatchRouter(projectFrom));\napp.use('/api/selections', assetSelectionRouter(projectFrom));\napp.get('/api/generation/jobs', asyncRoute((req, res) => { res.json(listImageGenerationJobs(projectFrom(req), { assetId: typeof req.query.assetId === 'string' ? req.query.assetId : undefined, rootAssetId: typeof req.query.rootAssetId === 'string' ? req.query.rootAssetId : undefined, limit: Number(req.query.limit || 12) })); }));\napp.get(\n '/api/review/queue',\n asyncRoute((req, res) => {\n res.json(\n getReviewQueue(projectFrom(req), {\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n limit: Number(req.query.limit || 6),\n })\n );\n })\n);\n\napp.get(\n '/api/assets/local-preview',\n asyncRoute((req, res) => {\n if (typeof req.query.path !== 'string') {\n res.status(400).json({ error: 'Local preview requires path' });\n return;\n }\n res.sendFile(localPreviewPath(req.query.path));\n })\n);\n\napp.post(\n '/api/index/local',\n asyncRoute((req, res) => {\n res.json({ ok: true, command: 'index local', project: projectFrom(req), summary: indexLineageAssets(projectFrom(req)) });\n })\n);\n\napp.get(\n '/api/lineage/:assetId/next',\n asyncRoute((req, res) => {\n res.json(getLineageNextAsset(projectFrom(req), req.params.assetId));\n })\n);\n\napp.get(\n '/api/lineage/:assetId/brief',\n asyncRoute((req, res) => {\n res.json(getLineageBrief(projectFrom(req), req.params.assetId));\n })\n);\n\napp.get(\n '/api/lineage/:assetId/children',\n asyncRoute((req, res) => {\n res.json(getLineageChildren(projectFrom(req), req.params.assetId));\n })\n);\n\nregisterLineageWorkspaceRoutes(app, projectFrom, asyncRoute);\nregisterLineageTaskRoutes(app, projectFrom, asyncRoute);\n\napp.get('/api/lineage/:rootAssetId/rerolls', asyncRoute((req, res) => {\n res.json(listLineageRerollRequests(projectFrom(req), req.params.rootAssetId));\n}));\n\napp.post('/api/lineage/:rootAssetId/rerolls/:nodeAssetId', asyncRoute((req, res) => {\n res.json(markLineageRerollRequest(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n requestedBy: req.body.requestedBy === 'agent' || req.body.requestedBy === 'system' ? req.body.requestedBy : 'human',\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.post('/api/lineage/:rootAssetId/rerolls/:nodeAssetId/cancel', asyncRoute((req, res) => {\n res.json(clearLineageRerollRequest(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.get('/api/lineage/:rootAssetId/attempts/:nodeAssetId', asyncRoute((req, res) => {\n res.json(getLineageAttempts(projectFrom(req), req.params.rootAssetId, req.params.nodeAssetId));\n}));\n\napp.post('/api/lineage/:rootAssetId/attempts/:nodeAssetId/promote', asyncRoute((req, res) => {\n res.json(promoteLineageAttempt(projectFrom(req), {\n rootAssetId: req.params.rootAssetId,\n nodeAssetId: req.params.nodeAssetId,\n attemptId: String(req.body.attemptId || ''),\n confirmWrite: req.body.confirmWrite === true,\n }));\n}));\n\napp.get('/api/lineage/:assetId', asyncRoute((req, res) => { res.json(getLineageSnapshot(projectFrom(req), req.params.assetId)); }));\n\napp.post(\n '/api/lineage/link',\n asyncRoute((req, res) => {\n res.json(\n linkLineageAssets(projectFrom(req), {\n parentAssetId: String(req.body.parentAssetId || ''),\n childAssetId: String(req.body.childAssetId || ''),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post('/api/lineage/remove-node', asyncRoute((req, res) => {\n res.json(removeLineageNode(projectFrom(req), { assetId: String(req.body.assetId || ''), rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined, confirmWrite: req.body.confirmWrite === true, claimToken: claimTokenFromRequest(req) }));\n}));\n\napp.post(\n '/api/lineage/layout',\n asyncRoute((req, res) => {\n const positions = (Array.isArray(req.body.positions) ? req.body.positions : []) as Array<Record<string, unknown>>;\n res.json(\n updateLineageLayout(projectFrom(req), {\n rootAssetId: String(req.body.rootAssetId || ''),\n positions: positions.map(position => ({\n assetId: String(position.assetId || ''),\n x: Number(position.x),\n y: Number(position.y),\n })),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post(\n '/api/lineage/link-child',\n asyncRoute((req, res) => {\n res.json(\n linkSelectedLineageChild(projectFrom(req), {\n rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined,\n childAssetId: String(req.body.childAssetId || ''),\n confirmWrite: req.body.confirmWrite === true,\n claimToken: claimTokenFromRequest(req),\n })\n );\n })\n);\n\napp.post(\n '/api/selection',\n asyncRoute((req, res) => {\n res.json(\n updateSelectedAsset(projectFrom(req), {\n assetId: typeof req.body.assetId === 'string' ? req.body.assetId : undefined,\n assetIds: Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : undefined,\n rootAssetId: typeof req.body.rootAssetId === 'string' ? req.body.rootAssetId : undefined,\n clear: req.body.clear === true,\n maxSelections: typeof req.body.maxSelections === 'number' ? req.body.maxSelections : undefined,\n mode: req.body.mode === 'add' || req.body.mode === 'remove' || req.body.mode === 'toggle' || req.body.mode === 'replace' ? req.body.mode : undefined,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/reviews/:assetId',\n asyncRoute((req, res) => {\n res.json(\n updateAssetReview(projectFrom(req), {\n assetId: req.params.assetId,\n reviewState: String(req.body.reviewState || 'unreviewed') as AssetReviewState,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/local-review/batch',\n asyncRoute((req, res) => {\n res.json(markAssetReviewsFromRequestBody(projectFrom(req), req.body as Record<string, unknown>));\n })\n);\n\napp.post(\n '/api/local-review/:assetId',\n asyncRoute((req, res) => {\n const rawState = String(req.body.reviewState || req.body.state || 'unreviewed');\n res.json(\n markAssetReview(projectFrom(req), {\n assetId: req.params.assetId,\n reviewState: rawState.replace(/-/g, '_') as AssetReviewState,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n confirmWrite: req.body.confirmWrite === true,\n })\n );\n })\n);\n\napp.post(\n '/api/assets/presign',\n asyncRoute((req, res) => {\n res.json(presignAsset(projectFrom(req), req.body.assetId, Number(req.body.expiresIn || 900)));\n })\n);\n\napp.post(\n '/api/assets/promote',\n asyncRoute((req, res) => {\n res.json(promoteAsset(projectFrom(req), req.body.assetId, Boolean(req.body.confirmWrite)));\n })\n);\n\napp.post(\n '/api/assets/pull',\n asyncRoute((req, res) => {\n res.json(pullAsset(projectFrom(req), req.body.assetId, typeof req.body.out === 'string' ? req.body.out : '.asset-scratch'));\n })\n);\n\napp.post(\n '/api/assets/archive',\n asyncRoute((req, res) => {\n res.json(archiveAsset(projectFrom(req), req.body.assetId, Boolean(req.body.confirmArchive)));\n })\n);\n\napp.post(\n '/api/assets/placement',\n asyncRoute((req, res) => {\n const body = req.body as Record<string, string | boolean>;\n const fields: PlacementFields = {\n assetId: String(body.assetId || ''),\n channel: String(body.channel || ''),\n status: String(body.status || 'planned') as PlacementStatus,\n scheduledAt: typeof body.scheduledAt === 'string' ? body.scheduledAt : undefined,\n postedAt: typeof body.postedAt === 'string' ? body.postedAt : undefined,\n url: typeof body.url === 'string' ? body.url : undefined,\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n confirmWrite: body.confirmWrite === true,\n };\n res.json(updatePlacement(projectFrom(req), fields));\n })\n);\n\napp.post(\n '/api/assets/delete-object',\n asyncRoute((req, res) => {\n res.json(deleteObjectGuarded(projectFrom(req), req.body.assetId, req.body.confirmation || ''));\n })\n);\n\napp.post(\n '/api/assets/upload',\n upload.single('file'),\n asyncRoute((req, res) => {\n const file = req.file?.path;\n try {\n if (!file) throw new Error('Upload requires a file');\n const body = req.body as Record<string, string>;\n const fields: UploadFields = {\n project: body.project || body.product || defaultProduct,\n campaign: body.campaign,\n channel: body.channel,\n audience: body.audience,\n status: body.status === 'published' ? 'published' : 'working',\n type: (body.type || 'image') as AssetContentType,\n assetId: body.assetId,\n title: body.title,\n hook: body.hook,\n cta: body.cta,\n utmContent: body.utmContent,\n messageFamily: body.messageFamily,\n format: body.format,\n notes: body.notes,\n confirmWrite: body.confirmWrite === 'true',\n };\n res.json(uploadAsset(file, fields));\n } finally {\n cleanupUploadedTemp(file);\n }\n })\n);\n\napp.post(\n '/api/assets/local-backup',\n asyncRoute((req, res) => {\n const body = req.body as Record<string, string | boolean>;\n const project = projectFrom(req);\n const path = typeof body.path === 'string' ? body.path : '';\n if (!path) throw new Error('Local backup requires path');\n const file = localPreviewPath(path);\n const fields: UploadFields = {\n project,\n assetId: String(body.assetId || ''),\n audience: String(body.audience || ''),\n campaign: String(body.campaign || ''),\n channel: String(body.channel || ''),\n cta: String(body.cta || ''),\n hook: String(body.hook || ''),\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n status: body.status === 'published' ? 'published' : 'working',\n title: String(body.title || ''),\n type: (body.type || 'image') as AssetContentType,\n utmContent: String(body.utmContent || ''),\n confirmWrite: body.confirmWrite === true,\n };\n if (body.dryRun === true) {\n res.json({ ok: true, message: `Ready to back up ${fields.assetId}`, output: { dryRun: true, path, fields } });\n return;\n }\n const approvedAsset = requireApprovedLocalBackupPath(project, path);\n res.json(uploadAsset(approvedAsset.local?.absolute_path || file, fields));\n })\n);\nif (isProduction) {\n const dist = join(repoRoot, 'dist', 'web');\n if (existsSync(dist)) {\n app.use(express.static(dist)); app.get('*', (_req, res) => res.sendFile(join(dist, 'index.html')));\n }\n} else {\n const { createServer: createViteServer } = await import('vite');\n const e2ePort = process.env.LINEAGE_E2E_PORT ? Number(process.env.LINEAGE_E2E_PORT) : undefined;\n const vite = await createViteServer({\n configFile: join(repoRoot, 'vite.config.ts'),\n server: {\n middlewareMode: true,\n ...(e2ePort ? { ws: { port: e2ePort + 1000 } } : {}),\n },\n appType: 'spa',\n });\n app.use(vite.middlewares);\n}\n\napp.use((error: unknown, _req: express.Request, res: express.Response, _next: express.NextFunction) => {\n if (error instanceof multer.MulterError && error.code === 'LIMIT_FILE_SIZE') {\n res.status(413).json({ error: `Upload exceeds ${Math.round(maxUploadBytes / 1024 / 1024)} MB` });\n return;\n }\n if (isLineageAssetError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isAssetLookupError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetReviewSetError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetReviewError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isContentBatchError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isPostingAdapterError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isAdapterSettingsError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAssetSelectionError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isGenerationReceiptError(error)) { res.status(error.status).json({ error: error.message }); return; }\n if (isAgentClaimError(error)) {\n res.status(error.status).json({ error: error.code, message: error.message, conflicts: error.conflicts });\n return;\n }\n if (isLineageWorkspaceError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isLineageTaskError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n if (isLineageError(error)) {\n res.status(error.status).json({ error: error.message });\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ error: message });\n});\n\napp.listen(port, host, () => { console.log(`Lineage listening on http://${host}:${port}`); });\n", "import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { createS3StorageAdapter } from './adapters/storage';\nimport { listLocalReviewAssets, localPreviewPath as resolveLocalPreviewPath } from './localReview';\nimport { syncLedgerPlacement } from './assetLedgerWorkflow';\nimport { appName } from '../shared/appConstants';\nimport type {\n AssetCatalog,\n AssetContentType,\n AssetFacets,\n DoctorReport,\n AssetLibrarySnapshot,\n GrowthAsset,\n ListAssetsOptions,\n LiveS3Object,\n MutationResponse,\n PlacementFields,\n PlacementStatus,\n PresignResponse,\n ProjectSummary,\n UploadFields,\n} from '../shared/types';\n\nfunction isPackageRoot(path: string): boolean {\n const packageJson = join(path, 'package.json');\n if (!existsSync(packageJson)) return false;\n try {\n const packageInfo = JSON.parse(readFileSync(packageJson, 'utf8')) as { name?: string };\n return packageInfo.name === '@mean-weasel/lineage';\n } catch {\n return false;\n }\n}\n\nfunction resolveRepoRoot(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n process.env.LINEAGE_REPO_ROOT,\n resolve(moduleDir, '..'),\n resolve(moduleDir, '../..'),\n process.cwd(),\n ].filter((candidate): candidate is string => Boolean(candidate));\n const root = candidates.find(isPackageRoot);\n if (!root) throw new Error('Unable to locate Lineage package root');\n return root;\n}\n\nexport const repoRoot = resolveRepoRoot();\nexport const defaultProject = 'demo-project';\nexport const defaultProduct = process.env.LINEAGE_DEFAULT_PRODUCT || defaultProject;\nconst publicFallbackBucket = 'lineage-demo-assets';\nconst publicFallbackRegion = 'us-east-1';\nconst contentTypes = new Set<AssetContentType>(['image', 'video', 'gif', 'audio', 'doc', 'other']);\nconst baseChannels = ['linkedin', 'meta', 'tiktok', 'x-twitter', 'youtube'];\nconst placementStatuses = new Set<PlacementStatus>(['planned', 'scheduled', 'posted', 'skipped']);\nconst projectNamePattern = /^[a-z0-9][a-z0-9-]*$/;\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nclass LineageAssetError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageAssetError(error: unknown): error is LineageAssetError {\n return error instanceof LineageAssetError;\n}\n\nexport function cleanProject(project = defaultProject): string {\n if (!projectNamePattern.test(project)) {\n throw new LineageAssetError('Project must be lowercase kebab-case');\n }\n return project;\n}\n\nexport function catalogPath(project = defaultProject): string {\n return join(repoRoot, cleanProject(project), 'assets', 'catalog.json');\n}\n\nfunction fixtureCatalogPath(project = defaultProject): string {\n return join(repoRoot, 'fixtures', cleanProject(project), 'assets', 'catalog.json');\n}\n\nfunction resolvedCatalogPath(project = defaultProject): string {\n const path = catalogPath(project);\n if (existsSync(path)) return path;\n const clean = cleanProject(project);\n if (clean === defaultProject && existsSync(fixtureCatalogPath(clean))) return fixtureCatalogPath(clean);\n return path;\n}\n\nexport function normalizeCatalog(catalog: Partial<AssetCatalog>, fallbackProject = defaultProject): AssetCatalog {\n const project = cleanProject(catalog.project || catalog.product || fallbackProject);\n const product = catalog.product || project;\n return {\n ...catalog,\n project,\n product,\n default_bucket: catalog.default_bucket || '',\n default_region: catalog.default_region || '',\n assets: (catalog.assets || []).map(asset => ({\n ...asset,\n source: asset.source || 'catalog',\n project: asset.project || asset.product || project,\n product: asset.product || asset.project || project,\n })),\n };\n}\n\nfunction fallbackS3(assetId: string, channel: string, status = 'working') {\n return {\n bucket: publicFallbackBucket,\n checksum_sha256: undefined,\n content_type: 'image/png',\n key: `products/${defaultProject}/campaigns/2026-06-public-demo/channels/${channel}/audiences/creators/statuses/${status}/types/image/assets/${assetId}/${assetId}.png`,\n region: publicFallbackRegion,\n size_bytes: 2048,\n updated_at: '2026-06-24T12:00:00.000Z',\n version_id: 'public-demo-version',\n };\n}\n\nfunction fallbackAsset(fields: Omit<GrowthAsset, 'audience' | 'campaign' | 'content_type' | 'cta' | 'hook' | 'product' | 'project' | 'source' | 'utm_content'> & {\n audience?: string;\n campaign?: string;\n cta?: string;\n hook?: string;\n utm_content?: string;\n}): GrowthAsset {\n return {\n audience: fields.audience || 'creators',\n campaign: fields.campaign || '2026-06-public-demo',\n content_type: 'image',\n cta: fields.cta || 'Save the idea',\n hook: fields.hook || 'Public demo creative for local review.',\n product: defaultProject,\n project: defaultProject,\n source: 'catalog',\n utm_content: fields.utm_content || fields.asset_id.replace(/-/g, '_'),\n ...fields,\n };\n}\n\nfunction defaultFallbackCatalog(): AssetCatalog {\n return normalizeCatalog({\n assets: [\n fallbackAsset({\n asset_id: 'demo-meta-short-form-upload-demo-post-static',\n channel: 'meta',\n s3: fallbackS3('demo-meta-short-form-upload-demo-post-static', 'meta'),\n status: 'working',\n title: 'Meta short-form demo post static',\n }),\n fallbackAsset({\n asset_id: 'demo-linkedin-ledger-catalog-shared',\n channel: 'linkedin',\n hook: 'Shared ledger creative with catalog metadata.',\n s3: fallbackS3('demo-linkedin-ledger-catalog-shared', 'linkedin'),\n status: 'working',\n title: 'LinkedIn ledger catalog shared',\n }),\n fallbackAsset({\n asset_id: 'demo-linkedin-upload-demo-done-static-grounded-v2',\n channel: 'linkedin',\n placements: [{\n channel: 'linkedin',\n notes: 'Synthetic public scheduled placement.',\n scheduled_at: '2026-06-24T16:00:00-07:00',\n status: 'scheduled',\n updated_at: '2026-06-24T12:30:00.000Z',\n }],\n s3: fallbackS3('demo-linkedin-upload-demo-done-static-grounded-v2', 'linkedin', 'approved'),\n status: 'approved',\n title: 'LinkedIn upload demo scheduled static',\n }),\n fallbackAsset({\n asset_id: 'demo-tiktok-upload-demo-export-vertical',\n channel: 'tiktok',\n format: 'vertical',\n hook: 'Fast vertical demo export for content queue tests.',\n s3: fallbackS3('demo-tiktok-upload-demo-export-vertical', 'tiktok'),\n status: 'working',\n title: 'TikTok upload demo export vertical',\n }),\n fallbackAsset({\n asset_id: 'demo-youtube-short-demo-posted-cut',\n channel: 'youtube',\n placements: [{\n channel: 'youtube',\n notes: 'Synthetic public posted placement.',\n posted_at: '2026-06-25T16:00:00-07:00',\n status: 'posted',\n updated_at: '2026-06-25T17:00:00.000Z',\n }],\n s3: fallbackS3('demo-youtube-short-demo-posted-cut', 'youtube', 'published'),\n status: 'published',\n title: 'YouTube short demo posted cut',\n }),\n fallbackAsset({\n asset_id: 'demo-x-twitter-carousel-demo-working-static',\n channel: 'x-twitter',\n format: 'static',\n s3: fallbackS3('demo-x-twitter-carousel-demo-working-static', 'x-twitter'),\n status: 'working',\n title: 'X Twitter carousel demo working static',\n }),\n ],\n default_bucket: '',\n default_region: '',\n product: defaultProject,\n project: defaultProject,\n }, defaultProject);\n}\n\nfunction isDefaultFallbackCatalog(catalog: AssetCatalog): boolean {\n return catalog.project === defaultProject && !existsSync(catalogPath(defaultProject));\n}\n\nfunction fallbackPreviewDataUrl(asset: GrowthAsset): string {\n const label = `${asset.title}\\n${asset.channel} / ${asset.status}`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\"><rect width=\"1200\" height=\"675\" fill=\"#f7f5ef\"/><rect x=\"56\" y=\"56\" width=\"1088\" height=\"563\" rx=\"18\" fill=\"#10201c\"/><text x=\"96\" y=\"145\" fill=\"#9fe6c8\" font-family=\"Arial, sans-serif\" font-size=\"34\" font-weight=\"700\">Lineage public demo preview</text><text x=\"96\" y=\"230\" fill=\"#fff8e6\" font-family=\"Arial, sans-serif\" font-size=\"56\" font-weight=\"700\">${escapeSvgText(asset.asset_id)}</text><text x=\"96\" y=\"330\" fill=\"#d9e8df\" font-family=\"Arial, sans-serif\" font-size=\"34\">${escapeSvgText(label)}</text><text x=\"96\" y=\"500\" fill=\"#9fb7ae\" font-family=\"Arial, sans-serif\" font-size=\"26\">Synthetic local placeholder. No external storage requested.</text></svg>`;\n return `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`;\n}\n\nfunction escapeSvgText(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport function loadCatalog(project = defaultProject): AssetCatalog {\n const path = catalogPath(project);\n if (existsSync(path)) {\n try {\n return normalizeCatalog(JSON.parse(readFileSync(path, 'utf8')) as Partial<AssetCatalog>, project);\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n throw new LineageAssetError(`Missing catalog: ${path}`, 404);\n }\n throw error;\n }\n }\n const clean = cleanProject(project);\n if (clean === defaultProject) {\n const fixturePath = fixtureCatalogPath(clean);\n if (existsSync(fixturePath)) {\n return normalizeCatalog(JSON.parse(readFileSync(fixturePath, 'utf8')) as Partial<AssetCatalog>, project);\n }\n return defaultFallbackCatalog();\n }\n throw new LineageAssetError(`Missing catalog: ${path}`, 404);\n}\n\nfunction saveCatalog(project: string, catalog: AssetCatalog): AssetCatalog {\n const normalized = normalizeCatalog(catalog, project);\n mkdirSync(dirname(catalogPath(project)), { recursive: true });\n writeFileSync(catalogPath(project), `${JSON.stringify(normalized, null, 2)}\\n`);\n return normalized;\n}\n\nfunction run(command: string, args: string[]): CommandResult {\n const result = spawnSync(command, args, {\n cwd: repoRoot,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n AWS_REGION: process.env.AWS_REGION || 'us-east-1',\n AWS_DEFAULT_REGION: process.env.AWS_DEFAULT_REGION || 'us-east-1',\n },\n });\n\n if (result.status !== 0) {\n const detail = result.stderr.trim() || result.stdout.trim();\n throw new LineageAssetError(`${command} ${args.join(' ')} failed${detail ? `: ${detail}` : ''}`, 502);\n }\n\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction runAws(args: string[]): CommandResult {\n return run('aws', args);\n}\n\nexport function listProjects(): ProjectSummary[] {\n const projects = readdirSync(repoRoot, { withFileTypes: true })\n .filter(entry => entry.isDirectory() && projectNamePattern.test(entry.name) && existsSync(catalogPath(entry.name)))\n .flatMap(entry => {\n try {\n const catalog = loadCatalog(entry.name);\n return [{ project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(entry.name), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length }];\n } catch (error) {\n if (error instanceof LineageAssetError && error.status === 404) return [];\n throw error;\n }\n })\n .sort((a, b) => a.project.localeCompare(b.project));\n if (!projects.some(item => item.project === defaultProject)) {\n const catalog = loadCatalog(defaultProject);\n projects.push({ project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(defaultProject), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length });\n projects.sort((a, b) => a.project.localeCompare(b.project));\n }\n return projects;\n}\n\nfunction assetById(catalog: AssetCatalog, assetId: string): GrowthAsset {\n const asset = catalog.assets.find(item => item.asset_id === assetId);\n if (!asset) throw new LineageAssetError(`Unknown asset: ${assetId}`, 404);\n return asset;\n}\n\nconst storageAdapter = createS3StorageAdapter({\n assetById,\n cleanProject,\n createError: (message, status) => new LineageAssetError(message, status),\n defaultProject,\n loadCatalog,\n runAws,\n repoRoot,\n saveCatalog,\n supportedContentTypes: contentTypes,\n});\n\nfunction uniqueSorted<T extends string>(values: Array<T | undefined>): T[] {\n return Array.from(new Set(values.filter(Boolean) as T[])).sort();\n}\n\nfunction facetsFor(assets: GrowthAsset[]): AssetFacets {\n return {\n audiences: uniqueSorted(assets.map(asset => asset.audience)),\n campaigns: uniqueSorted(assets.map(asset => asset.campaign)),\n channels: uniqueSorted([...baseChannels, ...assets.map(asset => asset.channel)]),\n contentTypes: uniqueSorted(assets.map(asset => asset.content_type)),\n placementStatuses: uniqueSorted(assets.flatMap(asset => asset.placements?.map(placement => placement.status) || [])),\n statuses: uniqueSorted(assets.map(asset => asset.status)),\n totalSizeBytes: assets.reduce((sum, asset) => sum + (asset.s3?.size_bytes || 0), 0),\n };\n}\n\nfunction filteredAssets(assets: GrowthAsset[], options: ListAssetsOptions): GrowthAsset[] {\n const query = options.query?.trim().toLowerCase();\n return assets.filter(asset => {\n if (options.status && options.status !== 'all' && asset.status !== options.status) return false;\n if (options.channel && options.channel !== 'all' && asset.channel !== options.channel) return false;\n if (options.type && options.type !== 'all' && asset.content_type !== options.type) return false;\n if (options.placementStatus === 'not-posted' && asset.placements?.some(placement => placement.status === 'posted')) return false;\n if (options.placementStatus && !['all', 'not-posted'].includes(options.placementStatus) && !asset.placements?.some(placement => placement.status === options.placementStatus)) return false;\n if (options.campaign && options.campaign !== 'all' && asset.campaign !== options.campaign) return false;\n if (options.audience && options.audience !== 'all' && asset.audience !== options.audience) return false;\n if (!query) return true;\n return [asset.asset_id, asset.title, asset.campaign, asset.channel, asset.audience, asset.hook, asset.cta]\n .join(' ')\n .toLowerCase()\n .includes(query);\n });\n}\n\nexport function listAssets(project = defaultProject, options: ListAssetsOptions = {}): AssetLibrarySnapshot {\n const catalog = loadCatalog(project);\n const pageSize = Math.min(Math.max(Number(options.pageSize || 10), 1), 100);\n const page = Math.max(Number(options.page || 1), 1);\n const localAssets = listLocalReviewAssets(repoRoot, catalog.project, catalog);\n const source = options.source || 'catalog';\n const sourceAssets = source === 'local' ? localAssets : source === 'all' ? [...localAssets, ...catalog.assets] : catalog.assets;\n const filtered = filteredAssets(sourceAssets, options);\n const totalPages = Math.max(Math.ceil(filtered.length / pageSize), 1);\n const safePage = Math.min(page, totalPages);\n const start = (safePage - 1) * pageSize;\n const pageAssets = filtered.slice(start, start + pageSize);\n let liveObjects: LiveS3Object[] = [];\n let error: string | undefined;\n if (options.includeLive && !isDefaultFallbackCatalog(catalog)) {\n try {\n liveObjects = storageAdapter.listLiveObjects(catalog);\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n }\n }\n return {\n catalog: { project: catalog.project, product: catalog.product, default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length },\n assets: pageAssets,\n facets: facetsFor(catalog.assets),\n pagination: { page: safePage, pageSize, total: filtered.length, totalPages },\n liveObjects,\n orphanObjects: liveObjects.filter(object => !object.cataloged),\n identity: options.includeLive && !isDefaultFallbackCatalog(catalog) ? storageAdapter.getIdentity() : undefined,\n fetchedAt: new Date().toISOString(),\n error,\n };\n}\n\nexport function inspectAsset(project: string, assetId: string): GrowthAsset {\n return assetById(loadCatalog(project), assetId);\n}\n\nexport function validateProject(project = defaultProject): ProjectSummary {\n const catalog = loadCatalog(project);\n return { project: catalog.project, product: catalog.product, catalogPath: resolvedCatalogPath(project), default_bucket: catalog.default_bucket, default_region: catalog.default_region, asset_count: catalog.assets.length };\n}\n\nexport function doctorProject(project = defaultProject, options: { includeLive?: boolean } = {}): DoctorReport {\n const summary = validateProject(project);\n let liveCheck: DoctorReport['liveCheck'] = 'skipped';\n let liveError: string | undefined;\n if (options.includeLive && isDefaultFallbackCatalog(loadCatalog(project))) {\n liveCheck = 'skipped';\n liveError = `${appName} public fallback uses local catalog data only.`;\n } else if (options.includeLive) {\n try {\n storageAdapter.listLiveObjects(loadCatalog(project));\n liveCheck = 'ok';\n } catch (error) {\n liveCheck = 'error';\n liveError = error instanceof Error ? error.message : String(error);\n }\n }\n return { catalogExists: true, deleteEnabled: process.env.LINEAGE_ENABLE_CLOUD_DELETE === 'true', project: summary, liveCheck, liveError };\n}\n\nexport function pullAsset(project: string, assetId: string, out = '.asset-scratch'): MutationResponse {\n return storageAdapter.pullAsset(project, assetId, out);\n}\n\nfunction placementFromFields(fields: PlacementFields) {\n if (!fields.channel) throw new LineageAssetError('Placement requires channel');\n if (!placementStatuses.has(fields.status)) throw new LineageAssetError(`Unsupported placement status: ${fields.status}`);\n const now = new Date().toISOString();\n return {\n channel: fields.channel,\n status: fields.status,\n ...(fields.scheduledAt ? { scheduled_at: fields.scheduledAt } : {}),\n ...(fields.postedAt ? { posted_at: fields.postedAt } : {}),\n ...(fields.url ? { url: fields.url } : {}),\n ...(fields.notes ? { notes: fields.notes } : {}),\n updated_at: now,\n };\n}\n\nexport function previewPlacement(project: string, fields: PlacementFields) {\n const asset = inspectAsset(project, fields.assetId);\n return { asset_id: asset.asset_id, placement: placementFromFields(fields) };\n}\n\nexport function updatePlacement(project: string, fields: PlacementFields): MutationResponse {\n if (!fields.confirmWrite) throw new LineageAssetError('Placement updates require confirmWrite=true');\n const catalog = loadCatalog(project);\n const asset = assetById(catalog, fields.assetId);\n const placement = placementFromFields(fields);\n const existing = asset.placements?.findIndex(item => item.channel === placement.channel);\n if (existing !== undefined && existing >= 0) asset.placements![existing] = placement;\n else asset.placements = [...(asset.placements || []), placement];\n saveCatalog(project, catalog);\n syncLedgerPlacement(project, asset.asset_id, placement);\n return { ok: true, message: `Marked ${asset.asset_id} ${placement.status} for ${placement.channel}`, catalog };\n}\n\nexport function presignAsset(project: string, assetId: string, expiresIn = 900): PresignResponse {\n const catalog = loadCatalog(project);\n if (isDefaultFallbackCatalog(catalog)) {\n const asset = assetById(catalog, assetId);\n return { assetId: asset.asset_id, expiresIn, url: fallbackPreviewDataUrl(asset) };\n }\n return storageAdapter.presignAsset(project, assetId, expiresIn);\n}\n\nexport function localPreviewPath(relativePath: string): string {\n try {\n return resolveLocalPreviewPath(repoRoot, relativePath);\n } catch (error) {\n throw new LineageAssetError(error instanceof Error ? error.message : 'Unknown local review asset', 404);\n }\n}\n\nexport function promoteAsset(project: string, assetId: string, confirmWrite: boolean): MutationResponse {\n return storageAdapter.promoteAsset(project, assetId, confirmWrite);\n}\n\nexport function archiveAsset(project: string, assetId: string, confirmArchive: boolean): MutationResponse {\n if (!confirmArchive) throw new LineageAssetError('Archive requires confirmArchive=true');\n const catalog = loadCatalog(project);\n const asset = assetById(catalog, assetId);\n asset.status = 'archived';\n saveCatalog(project, catalog);\n return { ok: true, message: `Archived ${assetId}`, catalog };\n}\n\nexport function uploadAsset(file: string, fields: UploadFields): MutationResponse {\n return storageAdapter.uploadAsset(file, fields);\n}\n\nexport function deleteObjectGuarded(project: string, assetId: string, confirmation: string): MutationResponse {\n return storageAdapter.deleteObjectGuarded(project, assetId, confirmation);\n}\n\nexport function ensureUploadDir(): string {\n const dir = join(repoRoot, '.asset-scratch', 'studio-uploads');\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nexport function cleanupUploadedTemp(file?: string): void {\n if (!file) return;\n const uploadRoot = ensureUploadDir();\n const resolved = resolve(file);\n if (resolved.startsWith(`${uploadRoot}/`) && existsSync(resolved)) {\n unlinkSync(resolved);\n }\n}\n", "import { copyFileSync, existsSync, mkdirSync, statSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\nimport { contentTypeFor, fileSha256 } from '../../localReview';\nimport type { AssetCatalog, LiveS3Object, MutationResponse, PresignResponse } from '../../../shared/types';\nimport type { StorageAdapter, StorageAdapterDependencies } from './types';\n\nexport function parseAssetIdFromS3Key(key: string): string | undefined {\n const marker = '/assets/';\n const index = key.indexOf(marker);\n if (index === -1) return undefined;\n return key.slice(index + marker.length).split('/')[0];\n}\n\nfunction previewDataUrl(asset: { asset_id: string; channel?: string; status?: string; title?: string }): string {\n const title = asset.title || asset.asset_id;\n const label = `${asset.channel || 'catalog'} / ${asset.status || 'working'}`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\"><rect width=\"1200\" height=\"675\" fill=\"#f7f5ef\"/><rect x=\"56\" y=\"56\" width=\"1088\" height=\"563\" rx=\"18\" fill=\"#10201c\"/><text x=\"96\" y=\"145\" fill=\"#9fe6c8\" font-family=\"Arial, sans-serif\" font-size=\"34\" font-weight=\"700\">Lineage catalog preview</text><text x=\"96\" y=\"230\" fill=\"#fff8e6\" font-family=\"Arial, sans-serif\" font-size=\"56\" font-weight=\"700\">${escapeSvgText(asset.asset_id)}</text><text x=\"96\" y=\"330\" fill=\"#d9e8df\" font-family=\"Arial, sans-serif\" font-size=\"34\">${escapeSvgText(title)}</text><text x=\"96\" y=\"500\" fill=\"#9fb7ae\" font-family=\"Arial, sans-serif\" font-size=\"26\">${escapeSvgText(label)}. No external storage requested.</text></svg>`;\n return `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`;\n}\n\nfunction escapeSvgText(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport function createS3StorageAdapter(deps: StorageAdapterDependencies): StorageAdapter {\n return {\n deleteObjectGuarded(project, assetId, confirmation): MutationResponse {\n const enabled = process.env.LINEAGE_ENABLE_CLOUD_DELETE === 'true';\n if (!enabled) {\n throw deps.createError('S3 delete is disabled. Use archive unless a human enables LINEAGE_ENABLE_CLOUD_DELETE.', 403);\n }\n if (confirmation !== `delete ${assetId}`) {\n throw deps.createError(`Delete confirmation must exactly equal: delete ${assetId}`);\n }\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n if (!asset.s3) throw deps.createError(`Asset has no S3 object: ${assetId}`);\n deps.runAws(['s3api', 'delete-object', '--bucket', asset.s3.bucket, '--key', asset.s3.key, '--region', asset.s3.region]);\n asset.status = 'archived';\n deps.saveCatalog(project, catalog);\n return { ok: true, message: `Deleted current S3 object and archived ${assetId}`, catalog };\n },\n\n getIdentity() {\n try {\n const output = deps.runAws(['sts', 'get-caller-identity', '--query', '{Account:Account,Arn:Arn}', '--output', 'json']);\n const parsed = JSON.parse(output.stdout) as { Account: string; Arn: string };\n return { account: parsed.Account, arn: parsed.Arn };\n } catch {\n return undefined;\n }\n },\n\n listLiveObjects(catalog: AssetCatalog): LiveS3Object[] {\n const bucket = catalog.default_bucket;\n const region = catalog.default_region;\n // Existing uploaded objects live under products/<project>; do not rewrite keys during project migration.\n const prefix = `products/${catalog.product}/`;\n const output = deps.runAws(['s3api', 'list-objects-v2', '--bucket', bucket, '--prefix', prefix, '--region', region, '--output', 'json']);\n const parsed = JSON.parse(output.stdout) as {\n Contents?: Array<{ Key: string; Size: number; LastModified: string; StorageClass?: string }>;\n };\n const catalogKeys = new Set(catalog.assets.map(asset => asset.s3?.key).filter(Boolean));\n return (parsed.Contents || []).map(item => ({\n key: item.Key,\n size: item.Size,\n lastModified: item.LastModified,\n storageClass: item.StorageClass,\n cataloged: catalogKeys.has(item.Key),\n assetId: parseAssetIdFromS3Key(item.Key),\n }));\n },\n\n presignAsset(project, assetId, expiresIn = 900): PresignResponse {\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n return { assetId, expiresIn, url: previewDataUrl(asset) };\n },\n\n promoteAsset(project, assetId, confirmWrite): MutationResponse {\n if (!confirmWrite) throw deps.createError('Promote requires confirmWrite=true');\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n asset.status = 'published';\n deps.saveCatalog(project, catalog);\n return {\n ok: true,\n message: `Promoted ${assetId}`,\n catalog,\n };\n },\n\n pullAsset(project, assetId, out = '.asset-scratch'): MutationResponse {\n const catalog = deps.loadCatalog(project);\n const asset = deps.assetById(catalog, assetId);\n return {\n ok: true,\n message: `Prepared ${assetId} for local review`,\n output: {\n assetId: asset.asset_id,\n out,\n storage: asset.local ? 'local' : asset.s3 ? 'catalog-s3-metadata' : 'catalog',\n note: 'Lineage public package does not pull cloud objects automatically.',\n },\n };\n },\n\n uploadAsset(file, fields): MutationResponse {\n if (!fields.confirmWrite) throw deps.createError('Upload requires confirmWrite=true');\n if (!existsSync(file)) throw deps.createError(`Upload file missing: ${file}`, 404);\n if (!['working', 'published'].includes(fields.status)) throw deps.createError('Upload status must be working or published');\n if (!deps.supportedContentTypes.has(fields.type)) throw deps.createError(`Unsupported asset type: ${fields.type}`);\n\n const project = deps.cleanProject(fields.project || fields.product || deps.defaultProject);\n const catalog = deps.loadCatalog(project);\n const relativePath = join('uploads', project, fields.assetId, basename(file));\n const absolutePath = join(deps.repoRoot, '.asset-scratch', relativePath);\n mkdirSync(dirname(absolutePath), { recursive: true });\n copyFileSync(file, absolutePath);\n const stats = statSync(absolutePath);\n const contentType = contentTypeFor(absolutePath);\n const checksumSha256 = fileSha256(absolutePath);\n const now = new Date().toISOString();\n const nextAsset = {\n asset_id: fields.assetId,\n audience: fields.audience,\n campaign: fields.campaign,\n channel: fields.channel,\n content_type: fields.type,\n cta: fields.cta,\n hook: fields.hook,\n ...(fields.format ? { format: fields.format } : {}),\n local: {\n absolute_path: absolutePath,\n checksum_sha256: checksumSha256,\n content_type: contentType,\n relative_path: relativePath,\n size_bytes: stats.size,\n updated_at: now,\n },\n ...(fields.messageFamily ? { message_family: fields.messageFamily } : {}),\n ...(fields.notes ? { notes: fields.notes } : {}),\n product: project,\n project,\n source: 'catalog' as const,\n status: fields.status,\n title: fields.title,\n utm_content: fields.utmContent,\n };\n const existing = catalog.assets.findIndex(asset => asset.asset_id === fields.assetId);\n if (existing >= 0) catalog.assets[existing] = { ...catalog.assets[existing], ...nextAsset };\n else catalog.assets.push(nextAsset);\n deps.saveCatalog(project, catalog);\n return {\n ok: true,\n message: `Recorded ${fields.assetId} locally`,\n output: {\n file: basename(absolutePath),\n relativePath,\n sizeBytes: stats.size,\n contentType,\n checksumSha256,\n },\n catalog,\n };\n },\n };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { basename, extname, join, relative, resolve } from 'node:path';\nimport type { AssetCatalog, AssetContentType, GrowthAsset } from '../shared/types';\n\nconst mimeByExt: Record<string, string> = {\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.mov': 'video/quicktime',\n '.mp4': 'video/mp4',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n};\nconst localReviewExts = new Set(Object.keys(mimeByExt));\nconst channelFromName = /\\b(linkedin|meta|tiktok|youtube|x-twitter|x)\\b/i;\nconst campaignFromPath = /\\b(20\\d{2}-\\d{2}-[a-z0-9-]+)\\b/i;\n\nclass LocalReviewError extends Error {\n status = 400;\n}\n\nfunction localReviewRoot(repoRoot: string): string {\n return join(repoRoot, '.asset-scratch');\n}\n\nexport function contentTypeFor(file: string): string {\n return mimeByExt[extname(file).toLowerCase()] || 'application/octet-stream';\n}\n\nexport function fileSha256(file: string): string {\n return createHash('sha256').update(readFileSync(file)).digest('hex');\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const relativePath = relative(parent, child);\n return Boolean(relativePath) && !relativePath.startsWith('..') && !relativePath.startsWith('/');\n}\n\nfunction walkLocalReviewFiles(dir: string, files: string[] = []): string[] {\n if (!existsSync(dir)) return files;\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return files;\n throw error;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'studio-uploads' || entry.name === 'playwright-results' || entry.name === 'lineage-demo') continue;\n if (process.env.NODE_ENV !== 'test' && /^vitest-/.test(entry.name)) continue;\n const path = join(dir, entry.name);\n if (entry.isDirectory()) walkLocalReviewFiles(path, files);\n else if (entry.isFile() && localReviewExts.has(extname(entry.name).toLowerCase())) files.push(path);\n }\n return files;\n}\n\nfunction inferCampaign(relativePath: string): string {\n return campaignFromPath.exec(relativePath)?.[1] || 'local-review';\n}\n\nfunction inferChannel(relativePath: string): string {\n const match = channelFromName.exec(relativePath);\n if (!match) return 'local';\n return match[1].toLowerCase() === 'x' ? 'x-twitter' : match[1].toLowerCase();\n}\n\nfunction inferContentType(file: string): AssetContentType {\n const mime = contentTypeFor(file);\n if (mime.startsWith('image/gif')) return 'gif';\n if (mime.startsWith('image/')) return 'image';\n if (mime.startsWith('video/')) return 'video';\n return 'other';\n}\n\nexport function listLocalReviewAssets(repoRoot: string, project: string, catalog: AssetCatalog): GrowthAsset[] {\n const catalogChecksums = new Set(catalog.assets.map(asset => asset.s3?.checksum_sha256).filter(Boolean));\n const root = localReviewRoot(repoRoot);\n return walkLocalReviewFiles(root)\n .flatMap(file => {\n try {\n const stats = statSync(file);\n const checksum = fileSha256(file);\n const relativePath = relative(root, file);\n return [{ checksum, file, relativePath, stats }];\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n })\n .filter(item => !catalogChecksums.has(item.checksum))\n .map(item => {\n const fileSlug = basename(item.file, extname(item.file));\n const channel = inferChannel(item.relativePath);\n return {\n asset_id: `local-${item.checksum.slice(0, 12)}`,\n project,\n product: project,\n source: 'local',\n campaign: inferCampaign(item.relativePath),\n channel,\n audience: 'local-review',\n status: 'planned',\n content_type: inferContentType(item.file),\n title: fileSlug.replace(/[-_]+/g, ' '),\n hook: item.relativePath,\n cta: 'Review before upload',\n utm_content: fileSlug.replace(/[^a-zA-Z0-9]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase() || 'local_review',\n notes: 'Local pre-push asset. Review and refine before uploading to S3.',\n local: {\n relative_path: item.relativePath,\n absolute_path: item.file,\n size_bytes: item.stats.size,\n content_type: contentTypeFor(item.file),\n checksum_sha256: item.checksum,\n updated_at: item.stats.mtime.toISOString(),\n },\n };\n });\n}\n\nexport function localPreviewPath(repoRoot: string, relativePath: string): string {\n const root = localReviewRoot(repoRoot);\n const resolved = resolve(root, relativePath);\n if (!isPathInside(resolved, root) || !existsSync(resolved)) throw new LocalReviewError('Unknown local review asset');\n if (!localReviewExts.has(extname(resolved).toLowerCase())) throw new LocalReviewError('Local preview type is not supported');\n return resolved;\n}\n", "import { createRequire } from 'node:module';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { repoRoot } from './assetCore';\n\nconst require = createRequire(import.meta.url);\nexport type DatabaseSync = DatabaseSyncType;\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function lineageDbPath(): string {\n return process.env.LINEAGE_DB || join(repoRoot, '.lineage', 'asset-lineage.sqlite');\n}\n\nexport function lineageDb(): DatabaseSync {\n mkdirSync(join(lineageDbPath(), '..'), { recursive: true });\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const database = new DatabaseSync(lineageDbPath());\n database.exec('PRAGMA foreign_keys = ON'); database.exec('PRAGMA busy_timeout = 5000');\n database.exec(`\n create table if not exists projects (\n id text primary key,\n product text not null,\n catalog_path text,\n created_at text not null,\n updated_at text not null\n );\n create table if not exists assets (\n id text primary key,\n project_id text not null references projects(id),\n source text not null check (source in ('local', 'catalog')),\n local_path text,\n s3_key text,\n checksum_sha256 text,\n media_type text not null,\n title text not null,\n status text not null,\n channel text,\n campaign text,\n audience text,\n size_bytes integer,\n content_type text,\n created_at text not null,\n updated_at text not null,\n last_seen_at text not null\n );\n create index if not exists assets_project_source_seen on assets(project_id, source, last_seen_at);\n create index if not exists assets_project_checksum on assets(project_id, checksum_sha256);\n create index if not exists assets_project_channel_campaign on assets(project_id, channel, campaign);\n create table if not exists lineage_schema_migrations (\n key text primary key,\n applied_at text not null\n );\n create table if not exists asset_edges (\n id text primary key,\n project_id text not null references projects(id),\n parent_asset_id text not null references assets(id),\n child_asset_id text not null references assets(id),\n relation_type text not null check (relation_type in ('derived_from')),\n created_at text not null,\n unique (project_id, parent_asset_id, child_asset_id, relation_type)\n );\n create index if not exists edges_parent on asset_edges(project_id, parent_asset_id);\n create index if not exists edges_child on asset_edges(project_id, child_asset_id);\n create table if not exists asset_attempts (\n id text primary key,\n project_id text not null references projects(id),\n node_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n attempt_index integer not null check (attempt_index > 0),\n source text not null check (source in ('initial', 'generated_child', 'reroll')),\n prompt text,\n generation_job_id text,\n file_path text,\n checksum_sha256 text,\n created_at text not null,\n promoted_at text,\n is_current integer not null check (is_current in (0, 1)),\n unique(project_id, node_asset_id, attempt_index),\n unique(project_id, node_asset_id, asset_id, source)\n );\n create unique index if not exists asset_attempts_one_current\n on asset_attempts(project_id, node_asset_id)\n where is_current = 1;\n create index if not exists asset_attempts_node_created\n on asset_attempts(project_id, node_asset_id, created_at);\n create table if not exists asset_reroll_requests (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n node_asset_id text not null references assets(id),\n status text not null check (status in ('pending', 'resolved', 'cancelled')),\n requested_by text not null check (requested_by in ('human', 'agent', 'system')),\n notes text,\n created_at text not null,\n resolved_at text\n );\n create unique index if not exists asset_reroll_requests_one_pending\n on asset_reroll_requests(project_id, root_asset_id, node_asset_id)\n where status = 'pending';\n create index if not exists asset_reroll_requests_root_status\n on asset_reroll_requests(project_id, root_asset_id, status, created_at);\n create table if not exists asset_reviews (\n asset_id text primary key references assets(id),\n review_state text not null check (review_state in ('unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored')),\n reviewed_at text,\n ignored_at text,\n notes text,\n updated_at text not null\n );\n create table if not exists asset_selections (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n notes text,\n selected_at text not null,\n unique(project_id, root_asset_id)\n );\n create table if not exists asset_layouts (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n x real not null,\n y real not null,\n updated_at text not null,\n unique(project_id, root_asset_id, asset_id)\n );\n create table if not exists lineage_workspaces (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n title text not null,\n status text not null check (status in ('active', 'paused', 'archived')),\n notes text,\n created_by text not null check (created_by in ('human', 'agent', 'system')),\n active_at text,\n created_at text not null,\n updated_at text not null,\n unique(project_id, root_asset_id)\n );\n create index if not exists lineage_workspaces_project_status on lineage_workspaces(project_id, status, updated_at);\n create index if not exists lineage_workspaces_project_active on lineage_workspaces(project_id, active_at);\n create table if not exists asset_ledger_records (\n id text primary key,\n project_id text not null references projects(id),\n canonical_asset_id text not null,\n checksum_sha256 text,\n media_type text not null,\n title text not null,\n status text not null,\n channel text,\n campaign text,\n audience text,\n created_at text not null,\n updated_at text not null,\n first_seen_at text not null default (datetime('now')),\n last_seen_at text not null\n );\n create index if not exists asset_ledger_records_project_seen on asset_ledger_records(project_id, last_seen_at);\n create index if not exists asset_ledger_records_project_checksum on asset_ledger_records(project_id, checksum_sha256);\n create table if not exists asset_ledger_sources (\n id text primary key,\n project_id text not null references projects(id),\n record_id text not null references asset_ledger_records(id) on delete cascade,\n source_type text not null check (source_type in ('local', 'catalog', 's3')),\n asset_id text,\n local_path text,\n s3_bucket text,\n s3_region text,\n s3_key text,\n s3_version_id text,\n etag text,\n size_bytes integer,\n content_type text,\n updated_at text,\n first_seen_at text not null default (datetime('now')),\n last_seen_at text not null\n );\n create index if not exists asset_ledger_sources_project_type on asset_ledger_sources(project_id, source_type);\n create index if not exists asset_ledger_sources_record on asset_ledger_sources(project_id, record_id);\n create index if not exists asset_ledger_sources_s3_key on asset_ledger_sources(project_id, s3_key);\n create table if not exists asset_ledger_placements (\n id text primary key,\n project_id text not null references projects(id),\n asset_id text not null,\n channel text not null,\n status text not null,\n scheduled_at text,\n posted_at text,\n url text,\n notes text,\n updated_at text not null,\n synced_at text not null,\n unique(project_id, asset_id, channel)\n );\n create index if not exists asset_ledger_placements_project_status on asset_ledger_placements(project_id, status);\n create index if not exists asset_ledger_placements_asset on asset_ledger_placements(project_id, asset_id);\n create table if not exists asset_ledger_index_runs (\n id text primary key,\n project_id text not null references projects(id),\n source_mode text not null check (source_mode in ('all', 'catalog', 'local')),\n include_live_s3 integer not null default 0,\n status text not null check (status in ('running', 'complete', 'failed')),\n started_at text not null,\n completed_at text,\n assets_indexed integer not null default 0,\n records_after integer not null default 0,\n catalog_sources_after integer not null default 0,\n local_sources_after integer not null default 0,\n s3_sources_after integer not null default 0,\n error text\n );\n create index if not exists asset_ledger_index_runs_project_started on asset_ledger_index_runs(project_id, started_at);\n create table if not exists content_batches (\n id text not null,\n project_id text not null references projects(id),\n title text not null,\n campaign text,\n channel text,\n status text not null check (status in ('active', 'archived')),\n notes text,\n created_at text not null,\n updated_at text not null,\n primary key(project_id, id)\n );\n create index if not exists content_batches_project_updated on content_batches(project_id, updated_at);\n create table if not exists content_posts (\n id text not null,\n project_id text not null references projects(id),\n batch_id text not null,\n channel text not null,\n title text not null,\n phase text not null check (phase in ('draft', 'review', 'scheduled', 'posted', 'skipped', 'archived')),\n campaign text,\n body text,\n cta text,\n scheduled_at text,\n posted_at text,\n url text,\n notes text,\n source_path text,\n created_at text not null,\n updated_at text not null,\n primary key(project_id, id),\n foreign key(project_id, batch_id) references content_batches(project_id, id) on delete cascade\n );\n create index if not exists content_posts_project_phase on content_posts(project_id, phase);\n create index if not exists content_posts_batch on content_posts(project_id, batch_id);\n create table if not exists content_post_assets (\n id text primary key,\n project_id text not null references projects(id),\n post_id text not null,\n asset_id text not null,\n role text not null,\n notes text,\n attached_at text not null,\n unique(project_id, post_id, asset_id, role),\n foreign key(project_id, post_id) references content_posts(project_id, id) on delete cascade\n );\n create index if not exists content_post_assets_post on content_post_assets(project_id, post_id);\n create index if not exists content_post_assets_asset on content_post_assets(project_id, asset_id);\n create table if not exists content_targets (\n project_id text primary key references projects(id),\n post_id text not null,\n notes text,\n selected_at text not null,\n updated_at text not null,\n foreign key(project_id, post_id) references content_posts(project_id, id) on delete cascade\n );\n create table if not exists selection_sets (\n id text primary key,\n project_id text not null references projects(id),\n kind text not null check (kind in ('current', 'review')),\n key text not null,\n label text not null,\n status text not null check (status in ('active', 'archived')),\n created_by text not null check (created_by in ('human', 'agent', 'system')),\n created_at text not null,\n updated_at text not null,\n unique(project_id, kind, key)\n );\n create index if not exists selection_sets_project_kind on selection_sets(project_id, kind, updated_at);\n create table if not exists selection_items (\n id text primary key,\n set_id text not null references selection_sets(id) on delete cascade,\n asset_id text not null,\n role text not null check (role in ('primary', 'candidate', 'next_base')),\n variation_label text,\n position integer not null default 0,\n selected_by text check (selected_by in ('human', 'agent', 'system')),\n selected_at text,\n deselected_at text,\n notes text,\n created_at text not null,\n updated_at text not null,\n unique(set_id, asset_id)\n );\n create index if not exists selection_items_set_position on selection_items(set_id, position);\n create unique index if not exists selection_items_set_label on selection_items(set_id, variation_label) where variation_label is not null;\n create table if not exists generation_jobs (\n id text primary key,\n project_id text not null references projects(id),\n provider text not null default 'codex-handoff',\n adapter_version text not null,\n source_mode text not null check (source_mode in ('lineage_selection', 'lineage_reroll')),\n root_asset_id text not null references assets(id),\n prompt text not null,\n expected_output_count integer not null check (expected_output_count > 0),\n status text not null check (status in ('planned', 'imported', 'failed', 'cancelled')),\n output_dir text,\n handoff_json text,\n created_at text not null,\n updated_at text not null,\n imported_at text\n );\n create index if not exists generation_jobs_project_created on generation_jobs(project_id, created_at);\n create table if not exists generation_job_inputs (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n project_id text not null references projects(id),\n asset_id text not null references assets(id),\n root_asset_id text not null references assets(id),\n role text not null check (role in ('lineage_next_base', 'reference', 'reroll_target')),\n position integer not null,\n selection_strategy text not null,\n selection_snapshot_json text not null,\n unique(job_id, asset_id, role)\n );\n create index if not exists generation_job_inputs_job on generation_job_inputs(job_id, position);\n create table if not exists generation_job_outputs (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n project_id text not null references projects(id),\n output_index integer not null,\n file_path text not null,\n checksum_sha256 text not null,\n size_bytes integer not null,\n content_type text not null,\n imported_asset_id text not null references assets(id),\n parent_asset_id text not null references assets(id),\n imported_at text not null,\n unique(job_id, output_index),\n unique(job_id, file_path)\n );\n create index if not exists generation_job_outputs_job on generation_job_outputs(job_id, output_index);\n create table if not exists generation_job_receipts (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n receipt_type text not null check (receipt_type in ('plan', 'import', 'error')),\n status text not null check (status in ('ok', 'error')),\n command text not null,\n payload_json text not null,\n created_at text not null\n );\n create index if not exists generation_job_receipts_job on generation_job_receipts(job_id, created_at);\n create table if not exists adapter_settings (project_id text not null references projects(id), adapter_type text not null check (adapter_type in ('cloud', 'scheduler', 'image_generator')), provider text not null, enabled integer not null check (enabled in (0, 1)), secret_ref text, safe_config_json text not null, created_at text not null, updated_at text not null, primary key(project_id, adapter_type, provider)); create index if not exists adapter_settings_project_type on adapter_settings(project_id, adapter_type);\n create table if not exists lineage_tasks (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n target_asset_id text not null references assets(id),\n task_type text not null check (task_type in ('iterate', 'reroll')),\n status text not null check (status in ('pending', 'claimed', 'in_progress', 'resolved', 'cancelled')),\n instructions text,\n created_by text not null check (created_by in ('human', 'agent', 'system')),\n created_at text not null,\n updated_at text not null,\n claimed_at text,\n started_at text,\n resolved_at text,\n cancelled_at text,\n resolved_generation_job_id text,\n resolved_asset_id text references assets(id),\n metadata_json text\n );\n create unique index if not exists lineage_tasks_one_open\n on lineage_tasks(project_id, root_asset_id, target_asset_id, task_type)\n where status in ('pending', 'claimed', 'in_progress');\n create index if not exists lineage_tasks_root_status\n on lineage_tasks(project_id, root_asset_id, status, updated_at);\n create index if not exists lineage_tasks_target\n on lineage_tasks(project_id, root_asset_id, target_asset_id, task_type, status);\n create table if not exists lineage_task_events (\n id text primary key,\n task_id text not null references lineage_tasks(id) on delete cascade,\n event_type text not null,\n actor text,\n message text,\n created_at text not null,\n metadata_json text\n );\n create index if not exists lineage_task_events_task_created\n on lineage_task_events(task_id, created_at);\n create table if not exists agent_claims (\n id text primary key,\n token_hash text not null,\n project_id text not null references projects(id),\n channel text,\n scope_type text not null check (scope_type in ('lineage_workspace', 'lineage_task', 'content_post', 'content_queue_lane', 'selection_set', 'project_channel')),\n target_id text not null,\n target_title text,\n agent_id text,\n agent_name text not null,\n agent_kind text not null,\n thread_id text,\n status text not null check (status in ('active', 'expired', 'released', 'revoked', 'transferred')),\n created_at text not null,\n heartbeat_at text not null,\n expires_at text not null,\n released_at text,\n revoked_at text,\n revoked_by text,\n override_reason text,\n metadata_json text\n );\n create unique index if not exists agent_claims_token_hash on agent_claims(token_hash);\n create index if not exists agent_claims_project_status on agent_claims(project_id, status, heartbeat_at);\n create index if not exists agent_claims_target on agent_claims(project_id, channel, scope_type, target_id, status);\n create table if not exists agent_claim_events (\n id text primary key,\n claim_id text not null references agent_claims(id) on delete cascade,\n event_type text not null,\n actor text,\n message text,\n created_at text not null,\n metadata_json text\n );\n create index if not exists agent_claim_events_claim_created on agent_claim_events(claim_id, created_at);\n `);\n migrateAssetSelections(database);\n dropLegacyAssetSelectionRootUnique(database);\n ensureColumn(database, 'asset_selections', 'notes', 'text');\n backfillLineageTasks(database);\n ensureColumn(database, 'asset_ledger_records', 'first_seen_at', 'text');\n ensureColumn(database, 'asset_ledger_records', 'indexed_by_run_id', 'text');\n ensureColumn(database, 'asset_ledger_sources', 'first_seen_at', 'text');\n ensureColumn(database, 'asset_ledger_sources', 'indexed_by_run_id', 'text');\n ensureReviewStateValues(database);\n ensureAgentClaimScopeValues(database);\n ensureGenerationReceiptCheckValues(database);\n return database;\n}\n\nexport function backfillLineageTasks(database: DatabaseSync): void {\n database.exec(`\n create table if not exists lineage_schema_migrations (\n key text primary key,\n applied_at text not null\n )\n `);\n const marker = database.prepare(\"select key from lineage_schema_migrations where key = 'lineage_tasks_backfilled_v1'\").get();\n if (marker) return;\n\n database.exec('BEGIN IMMEDIATE');\n try {\n database.exec(`\n insert or ignore into lineage_tasks (\n id, project_id, root_asset_id, target_asset_id, task_type, status, instructions,\n created_by, created_at, updated_at, metadata_json\n )\n select\n s.project_id || ':' || s.root_asset_id || ':lineage-task:iterate:' || s.asset_id,\n s.project_id,\n s.root_asset_id,\n s.asset_id,\n 'iterate',\n 'pending',\n s.notes,\n 'human',\n s.selected_at,\n s.selected_at,\n null\n from asset_selections s;\n\n insert or ignore into lineage_tasks (\n id, project_id, root_asset_id, target_asset_id, task_type, status, instructions,\n created_by, created_at, updated_at, metadata_json\n )\n select\n r.project_id || ':' || r.root_asset_id || ':lineage-task:reroll:' || r.node_asset_id,\n r.project_id,\n r.root_asset_id,\n r.node_asset_id,\n 'reroll',\n 'pending',\n r.notes,\n r.requested_by,\n r.created_at,\n r.created_at,\n null\n from asset_reroll_requests r\n where r.status = 'pending';\n `);\n database.prepare(`\n insert into lineage_schema_migrations (key, applied_at)\n values ('lineage_tasks_backfilled_v1', ?)\n on conflict(key) do nothing\n `).run(nowIso());\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n}\n\nfunction ensureColumn(database: DatabaseSync, table: string, column: string, definition: string): void {\n const rows = database.prepare(`pragma table_info(${table})`).all() as Array<{ name: string }>;\n if (!rows.some(row => row.name === column)) database.exec(`alter table ${table} add column ${column} ${definition}`);\n}\n\nfunction migrateAssetSelections(database: DatabaseSync): void {\n const rows = database.prepare('pragma table_info(asset_selections)').all() as Array<{ name: string }>;\n if (rows.some(row => row.name === 'position')) return;\n const notesSelect = rows.some(row => row.name === 'notes') ? 'notes' : 'null';\n\n database.exec(`\n create table if not exists asset_selections_v2 (\n id text primary key,\n project_id text not null references projects(id),\n root_asset_id text not null references assets(id),\n asset_id text not null references assets(id),\n position integer not null default 0,\n notes text,\n selected_at text not null,\n unique(project_id, root_asset_id, asset_id)\n );\n insert or ignore into asset_selections_v2 (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n select\n project_id || ':' || root_asset_id || ':selected:' || asset_id,\n project_id,\n root_asset_id,\n asset_id,\n 0,\n ${notesSelect},\n selected_at\n from asset_selections;\n drop table asset_selections;\n alter table asset_selections_v2 rename to asset_selections;\n create index if not exists asset_selections_project_root_position\n on asset_selections(project_id, root_asset_id, position, selected_at);\n `);\n}\n\nfunction dropLegacyAssetSelectionRootUnique(database: DatabaseSync): void {\n const indexes = database.prepare('pragma index_list(asset_selections)').all() as Array<{ name: string; unique: number }>;\n for (const index of indexes) {\n if (!index.unique) continue;\n const columns = database.prepare(`pragma index_info(${index.name})`).all() as Array<{ name: string }>;\n const columnNames = columns.map(column => column.name).join(',');\n if (columnNames === 'project_id,root_asset_id') database.exec(`drop index if exists ${index.name}`);\n }\n}\n\nfunction ensureReviewStateValues(database: DatabaseSync): void {\n const createSql = database.prepare(\"select sql from sqlite_master where type = 'table' and name = 'asset_reviews'\").get() as { sql?: string } | undefined;\n if (createSql?.sql?.includes('needs_revision')) return;\n\n database.exec(`\n alter table asset_reviews rename to asset_reviews_old;\n create table asset_reviews (\n asset_id text primary key references assets(id),\n review_state text not null check (review_state in ('unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored')),\n reviewed_at text,\n ignored_at text,\n notes text,\n updated_at text not null\n );\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews_old;\n drop table asset_reviews_old;\n `);\n}\n\nfunction ensureAgentClaimScopeValues(database: DatabaseSync): void {\n const createSql = database.prepare(\"select sql from sqlite_master where type = 'table' and name = 'agent_claims'\").get() as { sql?: string } | undefined;\n if (createSql?.sql?.includes(\"'lineage_task'\")) return;\n\n database.exec('PRAGMA foreign_keys = OFF; PRAGMA legacy_alter_table = ON; BEGIN IMMEDIATE');\n try {\n database.exec(`\n alter table agent_claims rename to agent_claims_old;\n create table agent_claims (\n id text primary key,\n token_hash text not null,\n project_id text not null references projects(id),\n channel text,\n scope_type text not null check (scope_type in ('lineage_workspace', 'lineage_task', 'content_post', 'content_queue_lane', 'selection_set', 'project_channel')),\n target_id text not null,\n target_title text,\n agent_id text,\n agent_name text not null,\n agent_kind text not null,\n thread_id text,\n status text not null check (status in ('active', 'expired', 'released', 'revoked', 'transferred')),\n created_at text not null,\n heartbeat_at text not null,\n expires_at text not null,\n released_at text,\n revoked_at text,\n revoked_by text,\n override_reason text,\n metadata_json text\n );\n insert into agent_claims\n select * from agent_claims_old;\n drop table agent_claims_old;\n create unique index if not exists agent_claims_token_hash on agent_claims(token_hash);\n create index if not exists agent_claims_project_status on agent_claims(project_id, status, heartbeat_at);\n create index if not exists agent_claims_target on agent_claims(project_id, channel, scope_type, target_id, status);\n `);\n const violations = database.prepare('pragma foreign_key_check').all();\n if (violations.length > 0) throw new Error(`Agent claim scope migration failed foreign key check: ${JSON.stringify(violations)}`);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n } finally {\n database.exec('PRAGMA legacy_alter_table = OFF; PRAGMA foreign_keys = ON');\n }\n}\n\nfunction tableCreateSql(database: DatabaseSync, table: string): string {\n const row = database.prepare(\"select sql from sqlite_master where type = 'table' and name = ?\").get(table) as { sql?: string } | undefined;\n return row?.sql || '';\n}\n\nfunction ensureGenerationReceiptCheckValues(database: DatabaseSync): void {\n const jobsSql = tableCreateSql(database, 'generation_jobs');\n const inputsSql = tableCreateSql(database, 'generation_job_inputs');\n const needsJobsMigration = Boolean(jobsSql && !jobsSql.includes(\"'lineage_reroll'\"));\n const needsInputsMigration = Boolean(inputsSql && !inputsSql.includes(\"'reroll_target'\"));\n if (!needsJobsMigration && !needsInputsMigration) return;\n\n database.exec('PRAGMA foreign_keys = OFF; PRAGMA legacy_alter_table = ON; BEGIN IMMEDIATE');\n try {\n if (needsJobsMigration) migrateGenerationJobsCheck(database);\n if (needsInputsMigration) migrateGenerationJobInputsCheck(database);\n const violations = database.prepare('pragma foreign_key_check').all();\n if (violations.length > 0) throw new Error(`Generation receipt migration failed foreign key check: ${JSON.stringify(violations)}`);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n } finally {\n database.exec('PRAGMA legacy_alter_table = OFF; PRAGMA foreign_keys = ON');\n }\n}\n\nfunction migrateGenerationJobsCheck(database: DatabaseSync): void {\n database.exec(`\n alter table generation_jobs rename to generation_jobs_legacy_check;\n create table generation_jobs (\n id text primary key,\n project_id text not null references projects(id),\n provider text not null default 'codex-handoff',\n adapter_version text not null,\n source_mode text not null check (source_mode in ('lineage_selection', 'lineage_reroll')),\n root_asset_id text not null references assets(id),\n prompt text not null,\n expected_output_count integer not null check (expected_output_count > 0),\n status text not null check (status in ('planned', 'imported', 'failed', 'cancelled')),\n output_dir text,\n handoff_json text,\n created_at text not null,\n updated_at text not null,\n imported_at text\n );\n insert into generation_jobs (\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at, imported_at\n )\n select\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at, imported_at\n from generation_jobs_legacy_check;\n drop table generation_jobs_legacy_check;\n create index if not exists generation_jobs_project_created on generation_jobs(project_id, created_at);\n `);\n}\n\nfunction migrateGenerationJobInputsCheck(database: DatabaseSync): void {\n database.exec(`\n alter table generation_job_inputs rename to generation_job_inputs_legacy_check;\n create table generation_job_inputs (\n id text primary key,\n job_id text not null references generation_jobs(id) on delete cascade,\n project_id text not null references projects(id),\n asset_id text not null references assets(id),\n root_asset_id text not null references assets(id),\n role text not null check (role in ('lineage_next_base', 'reference', 'reroll_target')),\n position integer not null,\n selection_strategy text not null,\n selection_snapshot_json text not null,\n unique(job_id, asset_id, role)\n );\n insert into generation_job_inputs (\n id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json\n )\n select\n id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json\n from generation_job_inputs_legacy_check;\n drop table generation_job_inputs_legacy_check;\n create index if not exists generation_job_inputs_job on generation_job_inputs(job_id, position);\n `);\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type {\n AssetLedgerRecord,\n AssetLedgerSelectionState,\n AssetLedgerSource,\n AssetLedgerWorkflowState,\n AssetPlacementState,\n AssetReviewLedgerState,\n GrowthAsset,\n PlacementStatus,\n} from '../shared/types';\n\ninterface ReviewRow {\n asset_id: string;\n review_state: AssetReviewLedgerState['review_state'];\n reviewed_at: string | null;\n ignored_at: string | null;\n notes: string | null;\n updated_at: string;\n}\n\ninterface PlacementRow {\n asset_id: string;\n channel: string;\n status: PlacementStatus;\n scheduled_at: string | null;\n posted_at: string | null;\n url: string | null;\n notes: string | null;\n updated_at: string;\n synced_at: string;\n}\n\ninterface SelectionRow {\n root_asset_id: string;\n asset_id: string;\n notes: string | null;\n selected_at: string;\n}\n\ntype PlacementInput = Omit<AssetPlacementState, 'asset_id' | 'synced_at'>;\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction upsertLedgerPlacement(database: DatabaseSync, project: string, assetId: string, placement: PlacementInput): void {\n const syncedAt = nowIso();\n database.prepare(`\n insert into asset_ledger_placements (\n id, project_id, asset_id, channel, status, scheduled_at, posted_at, url, notes, updated_at, synced_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, asset_id, channel) do update set\n status = excluded.status,\n scheduled_at = excluded.scheduled_at,\n posted_at = excluded.posted_at,\n url = excluded.url,\n notes = excluded.notes,\n updated_at = excluded.updated_at,\n synced_at = excluded.synced_at\n `).run(\n `${project}:${assetId}:placement:${placement.channel}`,\n project,\n assetId,\n placement.channel,\n placement.status,\n placement.scheduled_at || null,\n placement.posted_at || null,\n placement.url || null,\n placement.notes || null,\n placement.updated_at,\n syncedAt\n );\n}\n\nexport function upsertLedgerPlacementsForAsset(database: DatabaseSync, project: string, asset: GrowthAsset): void {\n for (const placement of asset.placements || []) upsertLedgerPlacement(database, project, asset.asset_id, placement);\n}\n\nexport function upsertLedgerWorkflowAsset(database: DatabaseSync, project: string, asset: GrowthAsset, timestamp: string): void {\n const source = asset.source === 'local' ? 'local' : 'catalog';\n database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n source = excluded.source, local_path = excluded.local_path, s3_key = excluded.s3_key,\n checksum_sha256 = excluded.checksum_sha256, media_type = excluded.media_type,\n title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `).run(\n asset.asset_id, project, source, asset.local?.relative_path || null, asset.s3?.key || null,\n asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null, asset.content_type, asset.title,\n asset.status, asset.channel || null, asset.campaign || null, asset.audience || null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null, asset.local?.content_type || asset.s3?.content_type || null,\n timestamp, timestamp, timestamp\n );\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `).run(asset.asset_id, timestamp);\n}\n\nexport function syncLedgerPlacement(project: string, assetId: string, placement: PlacementInput): void {\n const database = lineageDb();\n try {\n ensureProject(database, project);\n upsertLedgerPlacement(database, project, assetId, placement);\n } finally {\n database.close();\n }\n}\n\nfunction placeholders(values: string[]): string {\n return values.map(() => '?').join(',');\n}\n\nfunction assetIdsForRecord(record: AssetLedgerRecord, sources: AssetLedgerSource[]): string[] {\n return [...new Set([record.canonical_asset_id, ...sources.map(source => source.asset_id).filter(Boolean) as string[]])];\n}\n\nfunction reviewFromRow(row: ReviewRow): AssetReviewLedgerState {\n return {\n asset_id: row.asset_id,\n review_state: row.review_state,\n reviewed_at: row.reviewed_at || undefined,\n ignored_at: row.ignored_at || undefined,\n notes: row.notes || undefined,\n updated_at: row.updated_at,\n };\n}\n\nfunction placementFromRow(row: PlacementRow): AssetPlacementState {\n return {\n asset_id: row.asset_id,\n channel: row.channel,\n status: row.status,\n scheduled_at: row.scheduled_at || undefined,\n posted_at: row.posted_at || undefined,\n url: row.url || undefined,\n notes: row.notes || undefined,\n updated_at: row.updated_at,\n synced_at: row.synced_at,\n };\n}\n\nfunction selectionFromRow(row: SelectionRow): AssetLedgerSelectionState {\n return {\n root_asset_id: row.root_asset_id,\n asset_id: row.asset_id,\n notes: row.notes || undefined,\n selected_at: row.selected_at,\n };\n}\n\nexport function ledgerWorkflowStates(\n database: DatabaseSync,\n project: string,\n records: AssetLedgerRecord[],\n sources: AssetLedgerSource[]\n): Record<string, AssetLedgerWorkflowState> {\n const recordAssets = new Map(records.map(record => [record.id, assetIdsForRecord(record, sources.filter(source => source.record_id === record.id))]));\n const assetIds = [...new Set([...recordAssets.values()].flat())];\n if (assetIds.length === 0) return {};\n const marker = placeholders(assetIds);\n const reviews = database.prepare(`\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews\n where asset_id in (${marker})\n `).all(...assetIds) as unknown as ReviewRow[];\n const placements = database.prepare(`\n select asset_id, channel, status, scheduled_at, posted_at, url, notes, updated_at, synced_at\n from asset_ledger_placements\n where project_id = ? and asset_id in (${marker})\n `).all(project, ...assetIds) as unknown as PlacementRow[];\n const selections = database.prepare(`\n select root_asset_id, asset_id, notes, selected_at\n from asset_selections\n where project_id = ? and asset_id in (${marker})\n `).all(project, ...assetIds) as unknown as SelectionRow[];\n return Object.fromEntries(records.map(record => {\n const ids = recordAssets.get(record.id) || [];\n const review = reviews.find(row => ids.includes(row.asset_id));\n const selection = selections.find(row => ids.includes(row.asset_id));\n return [record.id, {\n review: review ? reviewFromRow(review) : undefined,\n placements: placements.filter(row => ids.includes(row.asset_id)).map(placementFromRow),\n selection: selection ? selectionFromRow(selection) : undefined,\n }];\n }));\n}\n", "import { cleanProject, loadCatalog, repoRoot } from './assetCore';\nimport { listLocalReviewAssets } from './localReview';\nimport type { AssetLookupSnapshot, GrowthAsset } from '../shared/types';\n\nclass AssetLookupError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetLookupError(error: unknown): error is AssetLookupError {\n return error instanceof AssetLookupError;\n}\n\nexport function lookupAssets(project: string, assetIds: string[]): AssetLookupSnapshot {\n const ids = [...new Set(assetIds.map(assetId => assetId.trim()).filter(Boolean))];\n if (ids.length > 50) throw new AssetLookupError('Asset lookup is limited to 50 asset IDs');\n const catalog = loadCatalog(cleanProject(project));\n const localAssets = listLocalReviewAssets(repoRoot, catalog.project, catalog);\n const byId = new Map<string, GrowthAsset>();\n for (const asset of [...catalog.assets, ...localAssets]) {\n if (ids.includes(asset.asset_id) && !byId.has(asset.asset_id)) byId.set(asset.asset_id, asset);\n }\n return {\n project: catalog.project,\n assets: ids.flatMap(assetId => byId.get(assetId) || []),\n missing: ids.filter(assetId => !byId.has(assetId)),\n fetchedAt: new Date().toISOString(),\n };\n}\n", "import { join } from 'node:path';\nimport { defaultProject, listAssets, repoRoot } from './assetCore';\nimport { lineageDb as db, lineageDbPath, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { LINEAGE_NEXT_VARIATION_LIMIT, normalizeSelectionInput, selectedRows, selectionId } from './assetLineageSelection';\nimport { cancelLineageTask, listLineageTasks, upsertLineageTask } from './assetLineageTasks';\nimport { activeLineageWorkspaceRoot } from './assetLineageWorkspaces';\nimport { requireLineageWorkspaceClaimForWrite } from './lineageClaimGuards';\nimport type {\n AssetReviewState,\n GrowthAsset,\n LineageAttempt,\n LineageAttemptPromotionResponse,\n LineageAttemptsResponse,\n LineageEdge,\n LineageChildrenResponse,\n LineageIndexSummary,\n LineageLayoutFields,\n LineageLinkFields,\n LineageNode,\n LineageNextResponse,\n LineagePosition,\n LineageRerollRequest,\n LineageRerollRequestMutationResponse,\n LineageRerollRequestsResponse,\n LineageSnapshot,\n LineageTask,\n ReviewFields,\n SelectionFields,\n} from '../shared/types';\n\nexport class LineageError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageError(error: unknown): error is LineageError {\n return error instanceof LineageError;\n}\n\nfunction collectAssets(project: string, source: 'catalog' | 'local'): GrowthAsset[] {\n const first = listAssets(project, { source, page: 1, pageSize: 100 });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { source, page, pageSize: 100 }).assets);\n }\n return assets;\n}\n\nfunction upsertProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n}\n\nfunction upsertAsset(database: DatabaseSync, project: string, asset: GrowthAsset): void {\n const timestamp = nowIso();\n const source = asset.source === 'local' ? 'local' : 'catalog';\n database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n source = excluded.source, local_path = excluded.local_path, s3_key = excluded.s3_key,\n checksum_sha256 = excluded.checksum_sha256, media_type = excluded.media_type,\n title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `).run(\n asset.asset_id, project, source, asset.local?.relative_path || null, asset.s3?.key || null,\n asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null, asset.content_type, asset.title,\n asset.status, asset.channel || null, asset.campaign || null, asset.audience || null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null, asset.local?.content_type || asset.s3?.content_type || null,\n timestamp, timestamp, timestamp\n );\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `).run(asset.asset_id, timestamp);\n}\n\nexport function indexLineageAssets(project = defaultProject): LineageIndexSummary {\n const database = db();\n const catalog = collectAssets(project, 'catalog');\n const local = collectAssets(project, 'local');\n upsertProject(database, project);\n for (const asset of [...catalog, ...local]) upsertAsset(database, project, asset);\n database.close();\n return { catalog: catalog.length, local: local.length, total: catalog.length + local.length, database: lineageDbPath() };\n}\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): void {\n const row = database.prepare('select id from assets where project_id = ? and id = ?').get(project, assetId);\n if (!row) throw new LineageError(`Unknown indexed asset: ${assetId}`, 404);\n}\n\nfunction parentOf(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select parent_asset_id from asset_edges where project_id = ? and child_asset_id = ? order by created_at limit 1').get(project, assetId) as { parent_asset_id?: string } | undefined;\n return row?.parent_asset_id;\n}\n\nfunction rootFor(database: DatabaseSync, project: string, assetId: string): string {\n let root = assetId;\n const seen = new Set<string>();\n while (!seen.has(root)) {\n seen.add(root);\n const parent = parentOf(database, project, root);\n if (!parent) return root;\n root = parent;\n }\n return assetId;\n}\n\nfunction assertCanonicalRoot(database: DatabaseSync, project: string, root: string): void {\n requireAsset(database, project, root);\n const canonicalRoot = rootFor(database, project, root);\n if (canonicalRoot !== root) throw new LineageError(`Asset ${root} is not a lineage root`, 400);\n}\n\nfunction explicitWorkspaceRoot(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare(`\n select root_asset_id from lineage_workspaces\n where project_id = ? and root_asset_id = ? and status != 'archived'\n `).get(project, assetId) as { root_asset_id?: string } | undefined;\n return row?.root_asset_id;\n}\n\nfunction nearestWorkspaceRoot(database: DatabaseSync, project: string, assetId: string): string {\n let current = assetId;\n const seen = new Set<string>();\n while (!seen.has(current)) {\n seen.add(current);\n const explicit = explicitWorkspaceRoot(database, project, current);\n if (explicit) return explicit;\n const parent = parentOf(database, project, current);\n if (!parent) return current;\n current = parent;\n }\n return assetId;\n}\n\nfunction assetChannel(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select channel from assets where project_id = ? and id = ?').get(project, assetId) as { channel?: string } | undefined;\n return row?.channel;\n}\n\nfunction lineageWriteClaimContext(database: DatabaseSync, project: string, assetId: string): { channel?: string; rootAssetId: string } {\n return {\n channel: assetChannel(database, project, assetId),\n rootAssetId: nearestWorkspaceRoot(database, project, assetId),\n };\n}\n\nexport function getLineageWriteClaimContext(project: string, assetId: string): { channel?: string; rootAssetId: string } {\n const database = db();\n try {\n requireAsset(database, project, assetId);\n return lineageWriteClaimContext(database, project, assetId);\n } finally {\n database.close();\n }\n}\n\nfunction latestSelectedRoot(database: DatabaseSync, project: string): string | undefined {\n const row = database.prepare('select root_asset_id from asset_selections where project_id = ? order by selected_at desc limit 1').get(project) as { root_asset_id?: string } | undefined;\n return row?.root_asset_id;\n}\n\nfunction resolveRoot(database: DatabaseSync, project: string, rootAssetId?: string): string {\n if (rootAssetId) {\n requireAsset(database, project, rootAssetId);\n return rootAssetId;\n }\n const root = activeLineageWorkspaceRoot(project) || latestSelectedRoot(database, project);\n if (!root) throw new LineageError('Lineage command requires --root unless a project selection exists');\n requireAsset(database, project, root);\n return root;\n}\n\nfunction edgeId(project: string, parent: string, child: string): string {\n return `${project}:${parent}:derived_from:${child}`;\n}\n\nfunction rerollRequestId(project: string, root: string, node: string, timestamp: string): string {\n return `${project}:${root}:reroll:${node}:${Date.parse(timestamp) || Date.now()}`;\n}\n\nfunction rowString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction rerollRequestFrom(row: Record<string, unknown>): LineageRerollRequest {\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n root_asset_id: String(row.root_asset_id),\n node_asset_id: String(row.node_asset_id),\n status: row.status as LineageRerollRequest['status'],\n requested_by: row.requested_by as LineageRerollRequest['requested_by'],\n notes: rowString(row.notes),\n created_at: String(row.created_at),\n resolved_at: rowString(row.resolved_at),\n };\n}\n\nfunction tasksByTarget(tasks: LineageTask[]): Map<string, Partial<Record<'iterate' | 'reroll', LineageTask>>> {\n const byTarget = new Map<string, Partial<Record<'iterate' | 'reroll', LineageTask>>>();\n for (const task of tasks) {\n if (task.task_type !== 'iterate' && task.task_type !== 'reroll') continue;\n const existing = byTarget.get(task.target_asset_id) || {};\n existing[task.task_type] = task;\n byTarget.set(task.target_asset_id, existing);\n }\n return byTarget;\n}\n\nfunction withRerollTask(request: LineageRerollRequest, task?: LineageTask): LineageRerollRequest {\n return task ? { ...request, task_id: task.id, task } : request;\n}\n\nfunction taskBackedRerollRequest(project: string, rootAssetId: string, task: LineageTask): LineageRerollRequest {\n return {\n id: `${task.id}:request`,\n project_id: project,\n root_asset_id: rootAssetId,\n node_asset_id: task.target_asset_id,\n status: 'pending',\n requested_by: task.created_by,\n notes: task.instructions,\n created_at: task.created_at,\n task_id: task.id,\n task,\n };\n}\n\nfunction attemptFrom(row: Record<string, unknown>): LineageAttempt {\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n node_asset_id: String(row.node_asset_id),\n asset_id: String(row.asset_id),\n attempt_index: Number(row.attempt_index),\n source: row.source as LineageAttempt['source'],\n prompt: rowString(row.prompt),\n generation_job_id: rowString(row.generation_job_id),\n file_path: rowString(row.file_path),\n checksum_sha256: rowString(row.checksum_sha256),\n created_at: String(row.created_at),\n promoted_at: rowString(row.promoted_at),\n is_current: Boolean(Number(row.is_current)),\n };\n}\n\nfunction implicitAttempt(row: { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string }, isCurrent = true): LineageAttempt {\n const createdAt = row.asset_created_at || nowIso();\n return {\n id: `${row.project}:${row.asset_id}:attempt:implicit`,\n project_id: row.project,\n node_asset_id: row.asset_id,\n asset_id: row.asset_id,\n attempt_index: 1,\n source: 'initial',\n file_path: row.local_path,\n checksum_sha256: row.checksum_sha256,\n created_at: createdAt,\n promoted_at: createdAt,\n is_current: isCurrent,\n };\n}\n\nfunction withImplicitAttempt(physicalAttempts: LineageAttempt[], row: { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string }): LineageAttempt[] {\n if (physicalAttempts.some(attempt => attempt.source === 'initial')) return physicalAttempts;\n return [...physicalAttempts, implicitAttempt(row, !physicalAttempts.some(attempt => attempt.is_current))];\n}\n\nfunction assertNodeInRoot(database: DatabaseSync, project: string, root: string, node: string): void {\n assertCanonicalRoot(database, project, root);\n requireAsset(database, project, node);\n const nodeRoot = rootFor(database, project, node);\n if (nodeRoot !== root) throw new LineageError(`Asset ${node} is not in lineage rooted at ${root}`);\n}\n\nfunction assertAttemptAssetNotVisibleLineageNode(database: DatabaseSync, project: string, root: string, assetId: string): void {\n const visibleNodeIds = new Set([\n root,\n ...descendants(database, project, root).flatMap(edge => [edge.parent_asset_id, edge.child_asset_id]),\n ]);\n if (visibleNodeIds.has(assetId)) throw new LineageError(`Attempt asset ${assetId} is already a visible lineage node in ${root}`, 400);\n}\n\nfunction canPreviewLocally(mediaType: string, localPath?: string): boolean {\n return Boolean(localPath && ['image', 'video', 'gif'].includes(mediaType));\n}\n\nfunction localPreviewUrl(project: string, localPath?: string): string | undefined {\n if (!localPath) return undefined;\n const params = new URLSearchParams({ project, path: localPath });\n return `/api/assets/local-preview?${params.toString()}`;\n}\n\nexport function linkLineageAssets(project: string, fields: LineageLinkFields) {\n const database = db();\n requireAsset(database, project, fields.parentAssetId);\n requireAsset(database, project, fields.childAssetId);\n if (fields.parentAssetId === fields.childAssetId) throw new LineageError('Lineage link cannot point to itself');\n const claimContext = lineageWriteClaimContext(database, project, fields.parentAssetId);\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: claimContext.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: claimContext.rootAssetId,\n writeKind: 'lineage_link',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n const edge = {\n id: edgeId(project, fields.parentAssetId, fields.childAssetId), parent_asset_id: fields.parentAssetId,\n child_asset_id: fields.childAssetId, relation_type: 'derived_from' as const, created_at: nowIso(),\n };\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, edge };\n }\n database.prepare(`\n insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?)\n on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing\n `).run(edge.id, project, edge.parent_asset_id, edge.child_asset_id, edge.created_at);\n database.close();\n return { ok: true as const, message: `Linked ${edge.child_asset_id} from ${edge.parent_asset_id}`, edge };\n}\n\nfunction descendants(database: DatabaseSync, project: string, root: string): LineageEdge[] {\n const edges: LineageEdge[] = [];\n const queue = [root];\n const seen = new Set<string>();\n while (queue.length > 0) {\n const parent = queue.shift()!;\n if (seen.has(parent)) continue;\n seen.add(parent);\n const rows = database.prepare('select id, parent_asset_id, child_asset_id, relation_type, created_at from asset_edges where project_id = ? and parent_asset_id = ? order by created_at').all(project, parent) as unknown as LineageEdge[];\n edges.push(...rows);\n queue.push(...rows.map(row => row.child_asset_id));\n }\n return edges;\n}\n\nexport function getLineageSnapshot(project: string, assetId: string): LineageSnapshot {\n const database = db();\n requireAsset(database, project, assetId);\n const root = explicitWorkspaceRoot(database, project, assetId) || rootFor(database, project, assetId);\n const edges = descendants(database, project, root);\n const selected = selectedRows(database, project, root);\n const tasks = listLineageTasks(project, root).tasks;\n const ids = [...new Set([\n root,\n ...edges.flatMap(edge => [edge.parent_asset_id, edge.child_asset_id]),\n ...selected.map(row => row.asset_id),\n ...tasks.map(task => task.target_asset_id),\n ])];\n const placeholders = ids.map(() => '?').join(',');\n const rows = database.prepare(`\n select a.id asset_id, a.project_id project, a.source, a.title, a.media_type, a.status, a.channel, a.campaign,\n a.local_path, a.s3_key, a.checksum_sha256, coalesce(r.review_state, 'unreviewed') review_state,\n r.notes review_notes, a.created_at asset_created_at, l.x layout_x, l.y layout_y\n from assets a left join asset_reviews r on r.asset_id = a.id\n left join asset_layouts l on l.project_id = a.project_id and l.root_asset_id = ? and l.asset_id = a.id\n where a.project_id = ? and a.id in (${placeholders})\n `).all(root, project, ...ids) as unknown as Array<Omit<LineageNode, 'attempt_count' | 'current_attempt' | 'is_latest' | 'lineage_tasks' | 'position' | 'preview_url' | 'reroll_request' | 'selection_note' | 'user_selected'> & { asset_created_at?: string; layout_x?: number; layout_y?: number }>;\n const attemptRows = ids.length > 0\n ? database.prepare(`select * from asset_attempts where project_id = ? and node_asset_id in (${placeholders}) order by node_asset_id, attempt_index desc`).all(project, ...ids) as Array<Record<string, unknown>>\n : [];\n const attemptsByNode = new Map<string, LineageAttempt[]>();\n for (const attempt of attemptRows.map(attemptFrom)) {\n attemptsByNode.set(attempt.node_asset_id, [...(attemptsByNode.get(attempt.node_asset_id) || []), attempt]);\n }\n const lineageTasksByNode = tasksByTarget(tasks);\n const rerollRows = ids.length > 0\n ? database.prepare(`select * from asset_reroll_requests where project_id = ? and root_asset_id = ? and status = 'pending' and node_asset_id in (${placeholders}) order by created_at`).all(project, root, ...ids) as Array<Record<string, unknown>>\n : [];\n const rerollsByNode = new Map(rerollRows.map(row => {\n const request = rerollRequestFrom(row);\n return [request.node_asset_id, withRerollTask(request, lineageTasksByNode.get(request.node_asset_id)?.reroll)] as const;\n }));\n const childIds = new Set(edges.map(edge => edge.parent_asset_id));\n const selectedIds = new Set(selected.map(row => row.asset_id));\n const selections = selected.map(row => ({\n asset_id: row.asset_id, notes: row.notes || undefined,\n position: Number(row.position || 0), selected_at: row.selected_at,\n }));\n const selection = selections[0] || null;\n const nodes = rows.map(row => {\n const position: LineagePosition | undefined = typeof row.layout_x === 'number' && typeof row.layout_y === 'number' ? { x: row.layout_x, y: row.layout_y } : undefined;\n const { asset_created_at: _assetCreatedAt, layout_x: _layoutX, layout_y: _layoutY, ...node } = row;\n const nodeSelection = selections.find(item => item.asset_id === row.asset_id);\n const attempts = withImplicitAttempt(attemptsByNode.get(row.asset_id) || [], row);\n const currentAttempt = attempts.find(attempt => attempt.is_current) || attempts[0];\n const previewPath = currentAttempt?.file_path || row.local_path;\n const lineageTasks = lineageTasksByNode.get(row.asset_id);\n return {\n ...node,\n attempt_count: attempts.length,\n current_attempt: currentAttempt,\n is_latest: !childIds.has(row.asset_id),\n lineage_tasks: lineageTasks && Object.keys(lineageTasks).length > 0 ? lineageTasks : undefined,\n position,\n preview_url: canPreviewLocally(row.media_type, previewPath) ? localPreviewUrl(project, previewPath) : undefined,\n reroll_request: rerollsByNode.get(row.asset_id),\n selection_note: nodeSelection?.notes,\n user_selected: selectedIds.has(row.asset_id),\n };\n });\n database.close();\n return {\n project,\n root_asset_id: root,\n active_asset_id: assetId,\n selected: selections.map(row => row.asset_id),\n selection,\n selections,\n tasks,\n latest: nodes.filter(node => node.is_latest).map(node => node.asset_id),\n nodes,\n edges,\n fetchedAt: nowIso(),\n };\n}\n\nexport function updateLineageLayout(project: string, fields: LineageLayoutFields) {\n if (fields.positions.length === 0) throw new LineageError('Lineage layout requires at least one position');\n const database = db();\n requireAsset(database, project, fields.rootAssetId);\n for (const position of fields.positions) requireAsset(database, project, position.assetId);\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: assetChannel(database, project, fields.rootAssetId),\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: fields.rootAssetId,\n writeKind: 'lineage_layout',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, root_asset_id: fields.rootAssetId, positions: fields.positions };\n }\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into asset_layouts (id, project_id, root_asset_id, asset_id, x, y, updated_at)\n values (?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, root_asset_id, asset_id) do update set\n x = excluded.x, y = excluded.y, updated_at = excluded.updated_at\n `);\n for (const position of fields.positions) {\n statement.run(`${project}:${fields.rootAssetId}:layout:${position.assetId}`, project, fields.rootAssetId, position.assetId, position.x, position.y, timestamp);\n }\n database.close();\n return { ok: true as const, message: `Saved ${fields.positions.length} lineage positions`, root_asset_id: fields.rootAssetId, positions: fields.positions };\n}\n\nexport function getLineageNextAsset(project: string, rootAssetId?: string): LineageNextResponse {\n const database = db();\n const root = resolveRoot(database, project, rootAssetId);\n database.close();\n const snapshot = getLineageSnapshot(project, root);\n const pendingIterateTasks = (snapshot.tasks || []).filter(task => task.task_type === 'iterate' && task.status === 'pending');\n const taskIdsInSelectionOrder = [\n ...snapshot.selections\n .map(selection => selection.asset_id)\n .filter(assetId => pendingIterateTasks.some(task => task.target_asset_id === assetId)),\n ...pendingIterateTasks\n .map(task => task.target_asset_id)\n .filter(assetId => !snapshot.selections.some(selection => selection.asset_id === assetId)),\n ];\n const taskSelectedIds = [...new Set(taskIdsInSelectionOrder)];\n const selectedIds = taskSelectedIds.length > 0 ? taskSelectedIds : snapshot.selected;\n const selectedNodes = selectedIds\n .map(assetId => snapshot.nodes.find(node => node.asset_id === assetId))\n .filter((node): node is LineageNode => Boolean(node));\n const taskSelections = taskSelectedIds.map((assetId, position) => {\n const task = pendingIterateTasks.find(item => item.target_asset_id === assetId);\n return {\n asset_id: assetId,\n notes: task?.instructions,\n position,\n selected_at: task?.created_at || nowIso(),\n };\n });\n const selectedSelection = taskSelections.length > 0 ? taskSelections[0] : snapshot.selection;\n const selectedSelections = taskSelections.length > 0 ? taskSelections : snapshot.selections;\n const latestNodes = snapshot.nodes.filter(node => snapshot.latest.includes(node.asset_id));\n const warnings: string[] = [];\n for (const selectedNode of selectedNodes) {\n if (selectedNode.is_latest) continue;\n warnings.push('Selected asset is not a latest leaf; agents should treat this as an intentional branch choice.');\n }\n if (selectedNodes.length > 0) {\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'selected',\n selection_mode: selectedNodes.length > 1 ? 'multiple' : 'single',\n recommended_action: 'evolve_variations',\n reason: 'user_selected',\n next_asset: selectedNodes[0],\n next_assets: selectedNodes,\n latest: snapshot.latest,\n selected: selectedIds,\n selection: selectedSelection,\n selections: selectedSelections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n }\n if (latestNodes.length === 1) {\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'single_latest',\n selection_mode: 'fallback',\n recommended_action: 'evolve_variations',\n reason: 'single_latest_fallback',\n next_asset: latestNodes[0],\n next_assets: [latestNodes[0]],\n latest: snapshot.latest,\n selected: selectedIds,\n selection: selectedSelection,\n selections: selectedSelections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n }\n return {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: latestNodes.length > 1 ? 'ambiguous_latest' : 'empty',\n selection_mode: 'none',\n recommended_action: latestNodes.length > 1 ? 'choose_next_base' : 'none',\n reason: latestNodes.length > 1 ? 'multiple_latest_no_selection' : 'no_lineage_candidates',\n next_asset: null,\n next_assets: [],\n latest: snapshot.latest,\n selected: selectedIds,\n selection: selectedSelection,\n selections: selectedSelections,\n candidates: latestNodes,\n warnings,\n fetchedAt: nowIso(),\n };\n}\n\nexport function getLineageChildren(project: string, parentAssetId: string): LineageChildrenResponse {\n const snapshot = getLineageSnapshot(project, parentAssetId);\n const edges = snapshot.edges.filter(edge => edge.parent_asset_id === parentAssetId);\n const childIds = new Set(edges.map(edge => edge.child_asset_id));\n return {\n project, parent_asset_id: parentAssetId,\n children: snapshot.nodes.filter(node => childIds.has(node.asset_id)),\n edges, fetchedAt: nowIso(),\n };\n}\n\nexport function listLineageRerollRequests(project: string, rootAssetId: string): LineageRerollRequestsResponse {\n const database = db();\n try {\n assertCanonicalRoot(database, project, rootAssetId);\n const rerollTasks = listLineageTasks(project, rootAssetId).tasks.filter(task => task.task_type === 'reroll');\n const pendingRerollTasks = listLineageTasks(project, rootAssetId, ['pending']).tasks.filter(task => task.task_type === 'reroll');\n const rerollTaskByTarget = new Map(rerollTasks.map(task => [task.target_asset_id, task]));\n const rows = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and status = 'pending'\n order by created_at, id\n `).all(project, rootAssetId) as Array<Record<string, unknown>>;\n const requests = rows.map(row => {\n const request = rerollRequestFrom(row);\n return withRerollTask(request, rerollTaskByTarget.get(request.node_asset_id));\n });\n const legacyTargets = new Set(requests.map(request => request.node_asset_id));\n for (const task of pendingRerollTasks) {\n if (!legacyTargets.has(task.target_asset_id)) requests.push(taskBackedRerollRequest(project, rootAssetId, task));\n }\n return { project, root_asset_id: rootAssetId, requests, fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function getLineageAttempts(project: string, rootAssetId: string, nodeAssetId: string): LineageAttemptsResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, rootAssetId, nodeAssetId);\n const rows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, nodeAssetId) as Array<Record<string, unknown>>;\n const asset = database.prepare('select id asset_id, project_id project, local_path, checksum_sha256, created_at asset_created_at from assets where project_id = ? and id = ?').get(project, nodeAssetId) as { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string };\n return { project, root_asset_id: rootAssetId, node_asset_id: nodeAssetId, attempts: withImplicitAttempt(rows.map(attemptFrom), asset), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function promoteLineageAttempt(project: string, fields: {\n rootAssetId: string;\n nodeAssetId: string;\n attemptId: string;\n confirmWrite: boolean;\n}): LineageAttemptPromotionResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const asset = database.prepare('select id asset_id, project_id project, local_path, checksum_sha256, created_at asset_created_at from assets where project_id = ? and id = ?').get(project, fields.nodeAssetId) as { asset_id: string; project: string; local_path?: string; checksum_sha256?: string; asset_created_at?: string };\n const rows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, fields.nodeAssetId) as Array<Record<string, unknown>>;\n const attempts = withImplicitAttempt(rows.map(attemptFrom), asset);\n const target = attempts.find(attempt => attempt.id === fields.attemptId);\n if (!target) throw new LineageError(`Attempt ${fields.attemptId} is not in ${fields.nodeAssetId}`, 404);\n const timestamp = nowIso();\n const promotedAttempt = { ...target, is_current: true, promoted_at: timestamp };\n if (!fields.confirmWrite) {\n return {\n ok: true,\n dryRun: true,\n project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n attempt: promotedAttempt,\n attempts: attempts.map(attempt => ({ ...attempt, is_current: attempt.id === target.id, promoted_at: attempt.id === target.id ? timestamp : attempt.promoted_at })),\n fetchedAt: timestamp,\n };\n }\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, fields.nodeAssetId);\n if (target.source !== 'initial') {\n const result = database.prepare(`\n update asset_attempts\n set is_current = 1, promoted_at = ?\n where project_id = ? and node_asset_id = ? and id = ?\n `).run(timestamp, project, fields.nodeAssetId, target.id);\n if (result.changes !== 1) throw new LineageError(`Attempt ${fields.attemptId} is not in ${fields.nodeAssetId}`, 404);\n }\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n const refreshedRows = database.prepare(`\n select * from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc, created_at desc\n `).all(project, fields.nodeAssetId) as Array<Record<string, unknown>>;\n const refreshedAttempts = withImplicitAttempt(refreshedRows.map(attemptFrom), asset);\n const attempt = refreshedAttempts.find(item => item.id === target.id) || promotedAttempt;\n return {\n ok: true,\n project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n attempt,\n attempts: refreshedAttempts,\n fetchedAt: nowIso(),\n };\n } finally {\n database.close();\n }\n}\n\nexport function recordLineageRerollAttempt(project: string, fields: {\n rootAssetId: string;\n nodeAssetId: string;\n assetId: string;\n prompt: string;\n generationJobId: string;\n filePath: string;\n checksumSha256: string;\n confirmWrite: boolean;\n}): { ok: true; attempt: LineageAttempt; dryRun?: true } {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n requireAsset(database, project, fields.assetId);\n assertAttemptAssetNotVisibleLineageNode(database, project, fields.rootAssetId, fields.assetId);\n const timestamp = nowIso();\n const maxRow = database.prepare('select max(attempt_index) max_index from asset_attempts where project_id = ? and node_asset_id = ?').get(project, fields.nodeAssetId) as { max_index?: number | null };\n const attemptIndex = Number(maxRow.max_index || 1) + 1;\n const attempt: LineageAttempt = {\n id: `${project}:${fields.nodeAssetId}:attempt:${attemptIndex}`,\n project_id: project,\n node_asset_id: fields.nodeAssetId,\n asset_id: fields.assetId,\n attempt_index: attemptIndex,\n source: 'reroll',\n prompt: fields.prompt,\n generation_job_id: fields.generationJobId,\n file_path: fields.filePath,\n checksum_sha256: fields.checksumSha256,\n created_at: timestamp,\n promoted_at: timestamp,\n is_current: true,\n };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, attempt };\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, fields.nodeAssetId);\n database.prepare(`\n insert into asset_attempts (\n id, project_id, node_asset_id, asset_id, attempt_index, source, prompt, generation_job_id,\n file_path, checksum_sha256, created_at, promoted_at, is_current\n ) values (?, ?, ?, ?, ?, 'reroll', ?, ?, ?, ?, ?, ?, 1)\n `).run(\n attempt.id, project, fields.nodeAssetId, fields.assetId, attempt.attempt_index, fields.prompt,\n fields.generationJobId, fields.filePath, fields.checksumSha256, timestamp, timestamp\n );\n database.prepare(`\n update asset_reroll_requests\n set status = 'resolved', resolved_at = ?\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n `).run(timestamp, project, fields.rootAssetId, fields.nodeAssetId);\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, 'unreviewed', ?, null, null, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, updated_at = excluded.updated_at\n `).run(fields.nodeAssetId, timestamp, timestamp);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, attempt };\n } finally {\n database.close();\n }\n}\n\nexport function markLineageRerollRequest(project: string, fields: { rootAssetId: string; nodeAssetId: string; notes?: string; requestedBy?: 'agent' | 'human' | 'system'; confirmWrite: boolean }): LineageRerollRequestMutationResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const existing = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n order by created_at desc limit 1\n `).get(project, fields.rootAssetId, fields.nodeAssetId) as Record<string, unknown> | undefined;\n const timestamp = nowIso();\n const request: LineageRerollRequest = existing ? {\n ...rerollRequestFrom(existing),\n notes: fields.notes || rerollRequestFrom(existing).notes,\n requested_by: fields.requestedBy || rerollRequestFrom(existing).requested_by,\n } : {\n id: rerollRequestId(project, fields.rootAssetId, fields.nodeAssetId, timestamp),\n project_id: project,\n root_asset_id: fields.rootAssetId,\n node_asset_id: fields.nodeAssetId,\n status: 'pending',\n requested_by: fields.requestedBy || 'human',\n notes: fields.notes,\n created_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, request };\n const taskResult = upsertLineageTask(project, {\n createdBy: request.requested_by,\n instructions: request.notes,\n rootAssetId: fields.rootAssetId,\n targetAssetId: fields.nodeAssetId,\n taskType: 'reroll',\n });\n if (existing) {\n database.prepare(`\n update asset_reroll_requests\n set requested_by = ?, notes = ?\n where id = ?\n `).run(request.requested_by, request.notes || null, request.id);\n } else {\n database.prepare(`\n insert into asset_reroll_requests (id, project_id, root_asset_id, node_asset_id, status, requested_by, notes, created_at, resolved_at)\n values (?, ?, ?, ?, 'pending', ?, ?, ?, null)\n `).run(request.id, project, fields.rootAssetId, fields.nodeAssetId, request.requested_by, request.notes || null, request.created_at);\n }\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, 'needs_revision', ?, null, ?, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, notes = coalesce(excluded.notes, asset_reviews.notes), updated_at = excluded.updated_at\n `).run(fields.nodeAssetId, timestamp, request.notes || null, timestamp);\n return {\n ok: true,\n request: withRerollTask(rerollRequestFrom(database.prepare('select * from asset_reroll_requests where id = ?').get(request.id) as Record<string, unknown>), taskResult.task),\n task_id: taskResult.task.id,\n task: taskResult.task,\n };\n } finally {\n database.close();\n }\n}\n\nexport function clearLineageRerollRequest(project: string, fields: { rootAssetId: string; nodeAssetId: string; confirmWrite: boolean }): LineageRerollRequestMutationResponse {\n const database = db();\n try {\n assertNodeInRoot(database, project, fields.rootAssetId, fields.nodeAssetId);\n const existing = database.prepare(`\n select * from asset_reroll_requests\n where project_id = ? and root_asset_id = ? and node_asset_id = ? and status = 'pending'\n order by created_at desc limit 1\n `).get(project, fields.rootAssetId, fields.nodeAssetId) as Record<string, unknown> | undefined;\n if (!existing) throw new LineageError(`No pending re-roll request for ${fields.nodeAssetId}`, 404);\n const timestamp = nowIso();\n const request = { ...rerollRequestFrom(existing), status: 'cancelled' as const, resolved_at: timestamp };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, request };\n const task = listLineageTasks(project, fields.rootAssetId, ['pending']).tasks.find(item => item.task_type === 'reroll' && item.target_asset_id === fields.nodeAssetId);\n const cancelledTask = task ? cancelLineageTask(project, {\n actor: 'human',\n confirmWrite: true,\n taskId: task.id,\n }).task : undefined;\n database.prepare(`\n update asset_reroll_requests\n set status = 'cancelled', resolved_at = ?\n where id = ?\n `).run(timestamp, request.id);\n return {\n ok: true,\n request: withRerollTask(request, cancelledTask),\n task_id: cancelledTask?.id,\n task: cancelledTask,\n };\n } finally {\n database.close();\n }\n}\n\nexport function updateSelectedAsset(project: string, fields: SelectionFields) {\n const database = db();\n let root: string;\n let current: ReturnType<typeof selectedRows>;\n let inputAssetIds: string[];\n let mode: NonNullable<SelectionFields['mode']>;\n let limit: number;\n let nextIds: string[];\n const notesByAsset = new Map<string, string | undefined>();\n try {\n inputAssetIds = normalizeSelectionInput(fields);\n root = fields.rootAssetId || (inputAssetIds[0] ? rootFor(database, project, inputAssetIds[0]) : '');\n if (!root) throw new LineageError('Selection requires rootAssetId or assetId');\n requireAsset(database, project, root);\n for (const assetId of inputAssetIds) requireAsset(database, project, assetId);\n mode = fields.mode || 'replace';\n limit = fields.maxSelections || LINEAGE_NEXT_VARIATION_LIMIT;\n if (!fields.confirmWrite) {\n return { ok: true as const, dryRun: true, root_asset_id: root, asset_ids: inputAssetIds, mode, clear: Boolean(fields.clear), max_selections: limit };\n }\n current = selectedRows(database, project, root);\n nextIds = current.map(row => row.asset_id);\n if (fields.clear) {\n nextIds = [];\n } else if (mode === 'replace') {\n nextIds = inputAssetIds;\n } else if (mode === 'add') {\n nextIds = [...nextIds, ...inputAssetIds];\n } else if (mode === 'remove') {\n nextIds = nextIds.filter(assetId => !inputAssetIds.includes(assetId));\n } else if (mode === 'toggle') {\n for (const assetId of inputAssetIds) {\n nextIds = nextIds.includes(assetId) ? nextIds.filter(id => id !== assetId) : [...nextIds, assetId];\n }\n }\n nextIds = [...new Set(nextIds)];\n if (!fields.clear && inputAssetIds.length === 0) throw new LineageError('Selection set requires assetId or assetIds');\n if (nextIds.length > limit) throw new LineageError(`Select at most ${limit} assets for next variation`);\n for (const assetId of nextIds) {\n const existing = current.find(row => row.asset_id === assetId);\n notesByAsset.set(assetId, inputAssetIds.includes(assetId) ? fields.notes || existing?.notes : existing?.notes);\n }\n } finally {\n database.close();\n }\n\n const removedIds = current.map(row => row.asset_id).filter(assetId => !nextIds.includes(assetId));\n const openIterateTasks = listLineageTasks(project, root, ['pending']).tasks.filter(task => task.task_type === 'iterate');\n for (const assetId of removedIds) {\n const task = openIterateTasks.find(item => item.target_asset_id === assetId);\n if (task) {\n cancelLineageTask(project, {\n actor: 'human',\n confirmWrite: true,\n taskId: task.id,\n });\n }\n }\n for (const assetId of nextIds) {\n upsertLineageTask(project, {\n createdBy: 'human',\n instructions: notesByAsset.get(assetId),\n rootAssetId: root,\n targetAssetId: assetId,\n taskType: 'iterate',\n });\n }\n\n const writeDatabase = db();\n writeDatabase.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, root);\n const timestamp = nowIso();\n const insert = writeDatabase.prepare(`\n insert into asset_selections (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n values (?, ?, ?, ?, ?, ?, ?)\n `);\n nextIds.forEach((assetId, position) => {\n insert.run(selectionId(project, root, assetId), project, root, assetId, position, notesByAsset.get(assetId) || null, timestamp);\n });\n writeDatabase.close();\n const message = nextIds.length === 0 ? `Cleared selected assets for ${root}` : `Selected ${nextIds.length} asset${nextIds.length === 1 ? '' : 's'} for ${root}`;\n return { ok: true as const, message, root_asset_id: root, asset_id: nextIds[0] || null, asset_ids: nextIds, mode };\n}\n\nexport function updateAssetReview(project: string, fields: ReviewFields) {\n const allowed = new Set<AssetReviewState>(['unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\n if (!allowed.has(fields.reviewState)) throw new LineageError(`Unsupported review state: ${fields.reviewState}`);\n const database = db();\n requireAsset(database, project, fields.assetId);\n if (!fields.confirmWrite) {\n database.close();\n return { ok: true as const, dryRun: true, asset_id: fields.assetId, review_state: fields.reviewState, notes: fields.notes };\n }\n const timestamp = nowIso();\n database.prepare(`\n insert into asset_reviews (asset_id, review_state, reviewed_at, ignored_at, notes, updated_at)\n values (?, ?, ?, ?, ?, ?)\n on conflict(asset_id) do update set\n review_state = excluded.review_state, reviewed_at = excluded.reviewed_at,\n ignored_at = excluded.ignored_at, notes = excluded.notes, updated_at = excluded.updated_at\n `).run(fields.assetId, fields.reviewState, timestamp, fields.reviewState === 'ignored' ? timestamp : null, fields.notes || null, timestamp);\n database.close();\n return { ok: true as const, message: `Marked ${fields.assetId} ${fields.reviewState}`, asset_id: fields.assetId, review_state: fields.reviewState };\n}\n", "import type { SelectionFields } from '../shared/types';\nimport type { DatabaseSync } from './assetLineageDb';\n\nexport const LINEAGE_NEXT_VARIATION_LIMIT = 3;\n\nexport interface LineageSelectionRow {\n asset_id: string;\n notes?: string;\n position: number;\n selected_at: string;\n}\n\nexport function selectionId(project: string, root: string, assetId: string): string {\n return `${project}:${root}:selected:${assetId}`;\n}\n\nexport function selectedRows(database: DatabaseSync, project: string, root: string): LineageSelectionRow[] {\n return database.prepare(`\n select asset_id, notes, position, selected_at\n from asset_selections\n where project_id = ? and root_asset_id = ?\n order by position, selected_at, asset_id\n `).all(project, root) as unknown as LineageSelectionRow[];\n}\n\nexport function normalizeSelectionInput(fields: SelectionFields): string[] {\n return [...new Set([...(fields.assetIds || []), fields.assetId || ''].map(assetId => assetId.trim()).filter(Boolean))];\n}\n", "import { randomBytes } from 'node:crypto';\nimport { createAgentClaim, recordAgentClaimWriteAllowed, releaseAgentClaim, revokeAgentClaimInDatabase, validateAgentClaimForWrite, type AgentClaim } from './agentClaims';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type {\n LineageTask,\n LineageTaskActor,\n LineageTaskEvent,\n LineageTaskMutationResponse,\n LineageTaskStatus,\n LineageTasksResponse,\n LineageTaskType,\n} from '../shared/types';\n\nclass LineageTaskError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageTaskError(error: unknown): error is LineageTaskError {\n return error instanceof LineageTaskError;\n}\n\ntype Row = Record<string, unknown>;\ntype LineageTaskMutationResult = Omit<LineageTaskMutationResponse, 'events'> & { project: string; events: LineageTaskEvent[] };\ntype LineageTaskClaimResult = LineageTaskMutationResult & { claim: AgentClaim; claim_token: string };\n\nconst activeStatuses: LineageTaskStatus[] = ['pending', 'claimed', 'in_progress'];\nconst taskTypes = new Set<LineageTaskType>(['iterate', 'reroll']);\nconst taskStatuses = new Set<LineageTaskStatus>(['pending', 'claimed', 'in_progress', 'resolved', 'cancelled']);\n\nexport function taskIdFor(project: string, rootAssetId: string, targetAssetId: string, taskType: LineageTaskType): string {\n return `${project}:${rootAssetId}:lineage-task:${taskType}:${targetAssetId}`;\n}\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${randomBytes(6).toString('base64url').toLowerCase()}`;\n}\n\nfunction metadataJson(metadata?: Record<string, unknown>): string | null {\n return metadata ? JSON.stringify(metadata) : null;\n}\n\nfunction metadataWithoutClaim(metadata?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n const next = { ...metadata };\n delete next.claim_id;\n return Object.keys(next).length > 0 ? next : undefined;\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== 'string' || !value) return undefined;\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeProject(project: string): string {\n const trimmed = project.trim();\n if (!trimmed) throw new LineageTaskError('Lineage task requires project');\n return trimmed;\n}\n\nfunction normalizeTaskType(taskType: LineageTaskType): LineageTaskType {\n if (!taskTypes.has(taskType)) throw new LineageTaskError(`Unsupported lineage task type: ${taskType}`);\n return taskType;\n}\n\nfunction normalizeStatus(status: LineageTaskStatus): LineageTaskStatus {\n if (!taskStatuses.has(status)) throw new LineageTaskError(`Unsupported lineage task status: ${status}`);\n return status;\n}\n\nfunction normalizeActor(actor: string, label: string): string {\n const trimmed = actor.trim();\n if (!trimmed) throw new LineageTaskError(`${label} is required`);\n return trimmed;\n}\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): void {\n const row = database.prepare('select id from assets where project_id = ? and id = ?').get(project, assetId);\n if (!row) throw new LineageTaskError(`Unknown indexed asset: ${assetId}`, 404);\n}\n\nfunction taskFromRow(row: Row): LineageTask {\n const metadata = parseMetadata(row.metadata_json);\n const claimId = typeof metadata?.claim_id === 'string' ? metadata.claim_id : undefined;\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n root_asset_id: String(row.root_asset_id),\n target_asset_id: String(row.target_asset_id),\n task_type: String(row.task_type) as LineageTaskType,\n status: String(row.status) as LineageTaskStatus,\n instructions: typeof row.instructions === 'string' ? row.instructions : undefined,\n created_by: String(row.created_by) as LineageTaskActor,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n claimed_at: typeof row.claimed_at === 'string' ? row.claimed_at : undefined,\n started_at: typeof row.started_at === 'string' ? row.started_at : undefined,\n resolved_at: typeof row.resolved_at === 'string' ? row.resolved_at : undefined,\n cancelled_at: typeof row.cancelled_at === 'string' ? row.cancelled_at : undefined,\n resolved_generation_job_id: typeof row.resolved_generation_job_id === 'string' ? row.resolved_generation_job_id : undefined,\n resolved_asset_id: typeof row.resolved_asset_id === 'string' ? row.resolved_asset_id : undefined,\n claimed_by_claim_id: claimId,\n metadata,\n };\n}\n\nfunction eventFromRow(row: Row): LineageTaskEvent {\n return {\n id: String(row.id),\n task_id: String(row.task_id),\n event_type: String(row.event_type) as LineageTaskEvent['event_type'],\n actor: typeof row.actor === 'string' ? row.actor : undefined,\n message: typeof row.message === 'string' ? row.message : undefined,\n created_at: String(row.created_at),\n metadata: parseMetadata(row.metadata_json),\n };\n}\n\nfunction findTask(database: DatabaseSync, project: string, taskId: string): LineageTask | null {\n const row = database.prepare('select * from lineage_tasks where project_id = ? and id = ?').get(project, taskId) as Row | undefined;\n return row ? taskFromRow(row) : null;\n}\n\nfunction requireTask(database: DatabaseSync, project: string, taskId: string): LineageTask {\n const task = findTask(database, project, taskId);\n if (!task) throw new LineageTaskError(`Unknown lineage task: ${taskId}`, 404);\n return task;\n}\n\nfunction taskEvents(database: DatabaseSync, taskId: string): LineageTaskEvent[] {\n const rows = database.prepare('select * from lineage_task_events where task_id = ? order by created_at, rowid').all(taskId) as Row[];\n return rows.map(eventFromRow);\n}\n\nfunction recordEvent(database: DatabaseSync, taskId: string, eventType: string, actor?: string, message?: string, metadata?: Record<string, unknown>): void {\n database.prepare(`\n insert into lineage_task_events (id, task_id, event_type, actor, message, created_at, metadata_json)\n values (?, ?, ?, ?, ?, ?, ?)\n `).run(randomId('lineage_task_event'), taskId, eventType, actor || null, message || null, nowIso(), metadataJson(metadata));\n}\n\nfunction taskWithEvents(database: DatabaseSync, project: string, taskId: string): LineageTaskMutationResult {\n return { project, ok: true, task: requireTask(database, project, taskId), events: taskEvents(database, taskId) };\n}\n\nfunction assertChanged(result: { changes: number | bigint }, message: string): void {\n if (Number(result.changes) !== 1) throw new LineageTaskError(message, 409);\n}\n\nfunction transaction<T>(database: DatabaseSync, callback: () => T): T {\n database.exec('BEGIN IMMEDIATE');\n try {\n const value = callback();\n database.exec('COMMIT');\n return value;\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n}\n\nfunction taskReadWithEvents(database: DatabaseSync, project: string, taskId: string) {\n return { task: requireTask(database, project, taskId), events: taskEvents(database, taskId) };\n}\n\nexport function listLineageTasks(project: string, rootAssetId: string, statuses: LineageTaskStatus[] = activeStatuses): LineageTasksResponse {\n const normalizedProject = normalizeProject(project);\n const normalizedStatuses = statuses.map(normalizeStatus);\n const database = lineageDb();\n try {\n requireAsset(database, normalizedProject, rootAssetId);\n if (normalizedStatuses.length === 0) {\n return { project: normalizedProject, root_asset_id: rootAssetId, tasks: [], fetchedAt: nowIso() };\n }\n const placeholders = normalizedStatuses.map(() => '?').join(',');\n const rows = database.prepare(`\n select * from lineage_tasks\n where project_id = ? and root_asset_id = ? and status in (${placeholders})\n order by updated_at desc, created_at desc, id\n `).all(normalizedProject, rootAssetId, ...normalizedStatuses) as Row[];\n return { project: normalizedProject, root_asset_id: rootAssetId, tasks: rows.map(taskFromRow), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function getLineageTask(project: string, taskId: string) {\n const normalizedProject = normalizeProject(project);\n const database = lineageDb();\n try {\n return { project: normalizedProject, ...taskReadWithEvents(database, normalizedProject, taskId) };\n } finally {\n database.close();\n }\n}\n\nexport function upsertLineageTask(project: string, fields: {\n createdBy: LineageTaskActor;\n instructions?: string;\n rootAssetId: string;\n targetAssetId: string;\n taskType: LineageTaskType;\n}): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const taskType = normalizeTaskType(fields.taskType);\n const taskId = taskIdFor(normalizedProject, fields.rootAssetId, fields.targetAssetId, taskType);\n const database = lineageDb();\n try {\n requireAsset(database, normalizedProject, fields.rootAssetId);\n requireAsset(database, normalizedProject, fields.targetAssetId);\n const existing = database.prepare(`\n select * from lineage_tasks\n where project_id = ? and root_asset_id = ? and target_asset_id = ? and task_type = ?\n and status in ('pending', 'claimed', 'in_progress')\n order by created_at desc limit 1\n `).get(normalizedProject, fields.rootAssetId, fields.targetAssetId, taskType) as Row | undefined;\n const instructions = fields.instructions?.trim() || undefined;\n if (existing) {\n const task = taskFromRow(existing);\n if (task.status !== 'pending' && instructions !== undefined && instructions !== task.instructions) {\n throw new LineageTaskError('Only pending lineage tasks can update instructions.', 409);\n }\n if (task.status === 'pending' && instructions !== undefined && instructions !== task.instructions) {\n const timestamp = nowIso();\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set instructions = ?, updated_at = ?\n where id = ? and status = 'pending'\n `).run(instructions, timestamp, task.id);\n assertChanged(result, 'Only pending lineage tasks can update instructions.');\n recordEvent(database, task.id, 'instructions_updated', fields.createdBy, 'Instructions updated.');\n });\n }\n return taskWithEvents(database, normalizedProject, task.id);\n }\n const closedTask = findTask(database, normalizedProject, taskId);\n if (closedTask) {\n const timestamp = nowIso();\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'pending', instructions = ?, created_by = ?, updated_at = ?,\n claimed_at = null, started_at = null, resolved_at = null, cancelled_at = null,\n resolved_generation_job_id = null, resolved_asset_id = null, metadata_json = null\n where id = ? and status not in ('pending', 'claimed', 'in_progress')\n `).run(instructions || null, fields.createdBy, timestamp, taskId);\n assertChanged(result, 'Lineage task changed while reopening.');\n recordEvent(database, taskId, 'created', fields.createdBy, 'Lineage task created.');\n });\n return taskWithEvents(database, normalizedProject, taskId);\n }\n const timestamp = nowIso();\n transaction(database, () => {\n database.prepare(`\n insert into lineage_tasks (\n id, project_id, root_asset_id, target_asset_id, task_type, status, instructions,\n created_by, created_at, updated_at, metadata_json\n ) values (?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?, null)\n `).run(taskId, normalizedProject, fields.rootAssetId, fields.targetAssetId, taskType, instructions || null, fields.createdBy, timestamp, timestamp);\n recordEvent(database, taskId, 'created', fields.createdBy, 'Lineage task created.');\n });\n return taskWithEvents(database, normalizedProject, taskId);\n } finally {\n database.close();\n }\n}\n\nexport function updateLineageTaskInstructions(project: string, fields: { taskId: string; instructions: string }): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const instructions = fields.instructions.trim();\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (task.status !== 'pending') throw new LineageTaskError('Only pending lineage tasks can update instructions.', 409);\n const timestamp = nowIso();\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set instructions = ?, updated_at = ?\n where id = ? and status = 'pending'\n `).run(instructions || null, timestamp, task.id);\n assertChanged(result, 'Only pending lineage tasks can update instructions.');\n recordEvent(database, task.id, 'instructions_updated', 'human', 'Instructions updated.');\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n\nexport function addLineageTaskComment(project: string, fields: { taskId: string; actor: string; message: string }): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const actor = normalizeActor(fields.actor, 'Comment actor');\n const message = fields.message.trim();\n if (!message) throw new LineageTaskError('Comment message is required');\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n transaction(database, () => {\n recordEvent(database, task.id, 'comment_added', actor, message);\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n\nexport function claimLineageTask(project: string, fields: { taskId: string; agentName: string }): LineageTaskClaimResult {\n const normalizedProject = normalizeProject(project);\n const agentName = normalizeActor(fields.agentName, 'Agent name');\n const beforeClaimDb = lineageDb();\n try {\n const task = requireTask(beforeClaimDb, normalizedProject, fields.taskId);\n if (task.status !== 'pending') throw new LineageTaskError('Only pending lineage tasks can be claimed.', 409);\n } finally {\n beforeClaimDb.close();\n }\n\n const claimResult = createAgentClaim({\n agentName,\n project: normalizedProject,\n scopeType: 'lineage_task',\n targetId: fields.taskId,\n targetTitle: fields.taskId,\n });\n if (!claimResult.claim) throw new LineageTaskError('Unable to create lineage task claim.', 500);\n const claim = claimResult.claim;\n\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (task.status !== 'pending') {\n releaseAgentClaim(claimResult.claim_token);\n throw new LineageTaskError('Only pending lineage tasks can be claimed.', 409);\n }\n const timestamp = nowIso();\n const metadata = { ...(task.metadata || {}), claim_id: claim.id };\n try {\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'claimed', claimed_at = ?, updated_at = ?, metadata_json = ?\n where id = ? and status = 'pending'\n `).run(timestamp, timestamp, metadataJson(metadata), task.id);\n assertChanged(result, 'Only pending lineage tasks can be claimed.');\n recordEvent(database, task.id, 'claimed', agentName, 'Lineage task claimed.', { claim_id: claim.id });\n });\n } catch (error) {\n releaseAgentClaim(claimResult.claim_token);\n throw error;\n }\n return {\n ...taskWithEvents(database, normalizedProject, task.id),\n claim,\n claim_token: claimResult.claim_token,\n };\n } finally {\n database.close();\n }\n}\n\nexport function startLineageTask(project: string, fields: { taskId: string; claimToken: string }): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const precheckDatabase = lineageDb();\n try {\n const task = requireTask(precheckDatabase, normalizedProject, fields.taskId);\n if (task.status !== 'claimed') throw new LineageTaskError('Only claimed lineage tasks can be started.', 409);\n } finally {\n precheckDatabase.close();\n }\n const validation = validateAgentClaimForWrite({\n claimToken: fields.claimToken,\n dangerLevel: 'enforce',\n project: normalizedProject,\n recordEvent: false,\n scopeType: 'lineage_task',\n targetId: fields.taskId,\n writeKind: 'lineage_task_start',\n });\n if (!validation.ok) throw new LineageTaskError(validation.message, 409);\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (task.status !== 'claimed') throw new LineageTaskError('Only claimed lineage tasks can be started.', 409);\n if (task.claimed_by_claim_id && task.claimed_by_claim_id !== validation.claim.id) {\n throw new LineageTaskError('Claim token does not match the task claim.', 409);\n }\n const timestamp = nowIso();\n const metadata = { ...(task.metadata || {}), claim_id: validation.claim.id };\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'in_progress', started_at = ?, updated_at = ?, metadata_json = ?\n where id = ? and status = 'claimed'\n `).run(timestamp, timestamp, metadataJson(metadata), task.id);\n assertChanged(result, 'Only claimed lineage tasks can be started.');\n recordEvent(database, task.id, 'started', validation.claim.agent_name, 'Lineage task started.', { claim_id: validation.claim.id });\n });\n recordAgentClaimWriteAllowed(validation.claim, {\n dangerLevel: 'enforce',\n targetId: fields.taskId,\n writeKind: 'lineage_task_start',\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n\nexport function overrideLineageTask(project: string, fields: {\n actor: string;\n instructions?: string;\n reason: string;\n taskId: string;\n}): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const actor = normalizeActor(fields.actor, 'Override actor');\n const reason = fields.reason.trim();\n if (!reason) throw new LineageTaskError('Override reason is required');\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (!['claimed', 'in_progress'].includes(task.status)) {\n throw new LineageTaskError(`Only claimed or in-progress lineage tasks can be overridden; task is ${task.status}.`, 409);\n }\n const timestamp = nowIso();\n const instructions = fields.instructions === undefined ? task.instructions : (fields.instructions.trim() || undefined);\n const metadata = metadataWithoutClaim(task.metadata);\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'pending', instructions = ?, claimed_at = null, started_at = null,\n updated_at = ?, metadata_json = ?\n where project_id = ? and id = ? and status in ('claimed', 'in_progress')\n `).run(instructions || null, timestamp, metadataJson(metadata), normalizedProject, task.id);\n assertChanged(result, `Only active lineage task ${task.id} could be overridden.`);\n if (task.claimed_by_claim_id) {\n revokeAgentClaimInDatabase(database, normalizedProject, task.claimed_by_claim_id, {\n actor,\n reason,\n });\n }\n recordEvent(database, task.id, 'human_override', actor, reason, {\n previous_claim_id: task.claimed_by_claim_id,\n previous_status: task.status,\n });\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n\nexport function cancelLineageTask(project: string, fields: { taskId: string; actor: string; confirmWrite: boolean; override?: boolean }): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const actor = normalizeActor(fields.actor, 'Cancel actor');\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (task.status === 'cancelled') return { project: normalizedProject, ok: true, task, events: taskEvents(database, task.id) };\n if (!['pending', 'claimed', 'in_progress'].includes(task.status)) {\n throw new LineageTaskError(`Only open lineage tasks can be cancelled; task is ${task.status}.`, 409);\n }\n if (task.status !== 'pending' && !fields.override) {\n throw new LineageTaskError('Cancelling an active lineage task requires override=true.', 409);\n }\n const overridingActiveTask = fields.override === true && task.status !== 'pending';\n const metadata = overridingActiveTask ? metadataWithoutClaim(task.metadata) : task.metadata;\n const timestamp = nowIso();\n const cancelledTask = {\n ...task,\n cancelled_at: timestamp,\n claimed_at: overridingActiveTask ? undefined : task.claimed_at,\n claimed_by_claim_id: overridingActiveTask ? undefined : task.claimed_by_claim_id,\n started_at: overridingActiveTask ? undefined : task.started_at,\n status: 'cancelled' as const,\n updated_at: timestamp,\n metadata,\n };\n if (!fields.confirmWrite) return { project: normalizedProject, ok: true, dryRun: true as const, task: cancelledTask, events: taskEvents(database, task.id) };\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'cancelled', cancelled_at = ?, claimed_at = ?, started_at = ?,\n updated_at = ?, metadata_json = ?\n where id = ? and status = ?\n `).run(\n timestamp,\n overridingActiveTask ? null : task.claimed_at || null,\n overridingActiveTask ? null : task.started_at || null,\n timestamp,\n metadataJson(metadata),\n task.id,\n task.status\n );\n assertChanged(result, `Only ${task.status} lineage task ${task.id} could be cancelled.`);\n if (overridingActiveTask) {\n if (task.claimed_by_claim_id) {\n revokeAgentClaimInDatabase(database, normalizedProject, task.claimed_by_claim_id, {\n actor,\n reason: 'Lineage task cancelled by human override.',\n });\n }\n recordEvent(database, task.id, 'human_override', actor, 'Lineage task cancelled by human override.', {\n previous_claim_id: task.claimed_by_claim_id,\n previous_status: task.status,\n });\n }\n recordEvent(database, task.id, 'cancelled', actor, 'Lineage task cancelled.');\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n\nexport function cancelLineageIterateTasksForAssets(project: string, fields: {\n actor: string;\n assetIds?: string[];\n confirmWrite: boolean;\n rootAssetId: string;\n}): LineageTaskMutationResult[] {\n const targetIds = fields.assetIds ? new Set(fields.assetIds) : undefined;\n return listLineageTasks(project, fields.rootAssetId, ['pending']).tasks\n .filter(task => task.task_type === 'iterate')\n .filter(task => !targetIds || targetIds.has(task.target_asset_id))\n .map(task => cancelLineageTask(project, {\n actor: fields.actor,\n confirmWrite: fields.confirmWrite,\n taskId: task.id,\n }));\n}\n\nexport function resolveLineageTask(project: string, fields: {\n actor: string;\n confirmWrite: boolean;\n resolvedAssetId?: string;\n resolvedGenerationJobId?: string;\n taskId: string;\n}): LineageTaskMutationResult {\n const normalizedProject = normalizeProject(project);\n const actor = normalizeActor(fields.actor, 'Resolve actor');\n const database = lineageDb();\n try {\n const task = requireTask(database, normalizedProject, fields.taskId);\n if (fields.resolvedAssetId) requireAsset(database, normalizedProject, fields.resolvedAssetId);\n if (task.status === 'resolved') return { project: normalizedProject, ok: true, task, events: taskEvents(database, task.id) };\n if (!['pending', 'claimed', 'in_progress'].includes(task.status)) {\n throw new LineageTaskError(`Only open lineage tasks can be resolved; task is ${task.status}.`, 409);\n }\n const timestamp = nowIso();\n const resolvedTask = {\n ...task,\n status: 'resolved' as const,\n resolved_asset_id: fields.resolvedAssetId,\n resolved_at: timestamp,\n resolved_generation_job_id: fields.resolvedGenerationJobId,\n updated_at: timestamp,\n };\n if (!fields.confirmWrite) return { project: normalizedProject, ok: true, dryRun: true as const, task: resolvedTask, events: taskEvents(database, task.id) };\n transaction(database, () => {\n const result = database.prepare(`\n update lineage_tasks\n set status = 'resolved', resolved_at = ?, resolved_generation_job_id = ?, resolved_asset_id = ?, updated_at = ?\n where id = ? and status = ?\n `).run(timestamp, fields.resolvedGenerationJobId || null, fields.resolvedAssetId || null, timestamp, task.id, task.status);\n assertChanged(result, `Only ${task.status} lineage task ${task.id} could be resolved.`);\n recordEvent(database, task.id, 'resolved', actor, 'Lineage task resolved.', {\n resolved_asset_id: fields.resolvedAssetId,\n resolved_generation_job_id: fields.resolvedGenerationJobId,\n });\n });\n return taskWithEvents(database, normalizedProject, task.id);\n } finally {\n database.close();\n }\n}\n", "import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\n\nexport type AgentClaimScopeType = 'lineage_workspace' | 'lineage_task' | 'content_post' | 'content_queue_lane' | 'selection_set' | 'project_channel';\ntype AgentClaimStatus = 'active' | 'expired' | 'released' | 'revoked' | 'transferred';\n\nexport interface AgentClaim {\n id: string;\n project: string;\n channel?: string;\n scope_type: AgentClaimScopeType;\n target_id: string;\n target_title?: string;\n agent_id?: string;\n agent_name: string;\n agent_kind: string;\n thread_id?: string;\n status: AgentClaimStatus;\n created_at: string;\n heartbeat_at: string;\n expires_at: string;\n released_at?: string;\n revoked_at?: string;\n revoked_by?: string;\n override_reason?: string;\n metadata?: Record<string, unknown>;\n heartbeat_age_seconds: number;\n derived_state: 'active' | 'idle' | 'stale' | 'expired';\n}\n\ninterface AgentClaimEvent {\n claim_id: string;\n event_type: string;\n actor?: string;\n message?: string;\n created_at: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateAgentClaimFields {\n project: string;\n channel?: string;\n scopeType: AgentClaimScopeType;\n targetId: string;\n targetTitle?: string;\n agentId?: string;\n agentName: string;\n agentKind?: string;\n threadId?: string;\n ttlSeconds?: number;\n force?: boolean;\n reason?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ValidateAgentClaimForWriteFields {\n claimToken?: string;\n project: string;\n channel?: string;\n scopeType: AgentClaimScopeType;\n targetId: string;\n writeKind: string;\n dangerLevel: 'claim' | 'warn' | 'enforce' | 'danger';\n confirmWrite?: boolean;\n recordEvent?: boolean;\n}\n\nexport type AgentClaimValidationResult =\n | { ok: true; claim: AgentClaim; warnings: string[] }\n | { ok: false; code: string; message: string; conflicts: AgentClaim[] };\n\ntype Row = Record<string, unknown>;\n\nconst defaultTtlSeconds = 20 * 60;\nconst idleAfterSeconds = 5 * 60;\nconst staleAfterSeconds = 15 * 60;\nconst scopes = new Set<AgentClaimScopeType>(['lineage_workspace', 'lineage_task', 'content_post', 'content_queue_lane', 'selection_set', 'project_channel']);\nconst claimTokenPattern = /claim_[a-z0-9_-]+\\.[A-Za-z0-9_-]+/g;\n\nexport class AgentClaimError extends Error {\n constructor(message: string, public status = 400, public code = 'agent_claim_error', public conflicts: AgentClaim[] = []) {\n super(message);\n }\n}\n\nexport function isAgentClaimError(error: unknown): error is AgentClaimError {\n return error instanceof AgentClaimError;\n}\n\nexport function redactAgentClaimTokens(input: string): string {\n return input.replace(claimTokenPattern, '[redacted-claim-token]');\n}\n\nexport function parseClaimTtl(value?: string): number {\n if (!value) return defaultTtlSeconds;\n const match = value.trim().match(/^(\\d+)(s|m|h)?$/);\n if (!match) throw new AgentClaimError(`Invalid claim ttl: ${value}`);\n const amount = Number(match[1]);\n const unit = match[2] || 's';\n const multiplier = unit === 'h' ? 3600 : unit === 'm' ? 60 : 1;\n const seconds = amount * multiplier;\n if (!Number.isInteger(seconds) || seconds < 30 || seconds > 24 * 60 * 60) {\n throw new AgentClaimError('Claim ttl must be between 30 seconds and 24 hours');\n }\n return seconds;\n}\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${randomBytes(6).toString('base64url').toLowerCase()}`;\n}\n\nfunction tokenHash(token: string): string {\n return createHash('sha256').update(token).digest('hex');\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const left = Buffer.from(a);\n const right = Buffer.from(b);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\nfunction expiresAtFrom(timestamp: string, ttlSeconds: number): string {\n return new Date(new Date(timestamp).getTime() + ttlSeconds * 1000).toISOString();\n}\n\nfunction metadataJson(metadata?: Record<string, unknown>): string | null {\n return metadata ? JSON.stringify(metadata) : null;\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== 'string' || !value) return undefined;\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction derivedState(row: { status: AgentClaimStatus; heartbeat_at: string; expires_at: string }, now = new Date()): AgentClaim['derived_state'] {\n if (row.status !== 'active') return row.status === 'expired' ? 'expired' : 'stale';\n if (new Date(row.expires_at).getTime() <= now.getTime()) return 'expired';\n const ageSeconds = Math.max(0, Math.floor((now.getTime() - new Date(row.heartbeat_at).getTime()) / 1000));\n if (ageSeconds >= staleAfterSeconds) return 'stale';\n if (ageSeconds >= idleAfterSeconds) return 'idle';\n return 'active';\n}\n\nfunction rowToClaim(row: Row, now = new Date()): AgentClaim {\n const heartbeatAt = String(row.heartbeat_at);\n return {\n id: String(row.id),\n project: String(row.project_id),\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n scope_type: String(row.scope_type) as AgentClaimScopeType,\n target_id: String(row.target_id),\n target_title: typeof row.target_title === 'string' ? row.target_title : undefined,\n agent_id: typeof row.agent_id === 'string' ? row.agent_id : undefined,\n agent_name: String(row.agent_name),\n agent_kind: String(row.agent_kind),\n thread_id: typeof row.thread_id === 'string' ? row.thread_id : undefined,\n status: String(row.status) as AgentClaimStatus,\n created_at: String(row.created_at),\n heartbeat_at: heartbeatAt,\n expires_at: String(row.expires_at),\n released_at: typeof row.released_at === 'string' ? row.released_at : undefined,\n revoked_at: typeof row.revoked_at === 'string' ? row.revoked_at : undefined,\n revoked_by: typeof row.revoked_by === 'string' ? row.revoked_by : undefined,\n override_reason: typeof row.override_reason === 'string' ? row.override_reason : undefined,\n metadata: parseMetadata(row.metadata_json),\n heartbeat_age_seconds: Math.max(0, Math.floor((now.getTime() - new Date(heartbeatAt).getTime()) / 1000)),\n derived_state: derivedState({\n expires_at: String(row.expires_at),\n heartbeat_at: heartbeatAt,\n status: String(row.status) as AgentClaimStatus,\n }, now),\n };\n}\n\nfunction eventToRow(row: Row): AgentClaimEvent {\n return {\n claim_id: String(row.claim_id),\n event_type: String(row.event_type),\n actor: typeof row.actor === 'string' ? row.actor : undefined,\n message: typeof row.message === 'string' ? row.message : undefined,\n created_at: String(row.created_at),\n metadata: parseMetadata(row.metadata_json),\n };\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction recordEvent(database: DatabaseSync, claimId: string, eventType: string, actor?: string, message?: string, metadata?: Record<string, unknown>): void {\n database.prepare(`\n insert into agent_claim_events (id, claim_id, event_type, actor, message, created_at, metadata_json)\n values (?, ?, ?, ?, ?, ?, ?)\n `).run(randomId('claim_event'), claimId, eventType, actor || null, message || null, nowIso(), metadataJson(metadata));\n}\n\nfunction expireActiveClaims(database: DatabaseSync): void {\n const timestamp = nowIso();\n const expired = database.prepare(`\n select id from agent_claims where status = 'active' and expires_at <= ?\n `).all(timestamp) as Array<{ id: string }>;\n if (expired.length === 0) return;\n database.prepare(`\n update agent_claims set status = 'expired' where status = 'active' and expires_at <= ?\n `).run(timestamp);\n for (const claim of expired) recordEvent(database, claim.id, 'expired', 'system', 'Claim expired after missed heartbeat.');\n}\n\nfunction normalizeScope(scopeType: AgentClaimScopeType): AgentClaimScopeType {\n if (!scopes.has(scopeType)) throw new AgentClaimError(`Unsupported claim scope: ${scopeType}`);\n return scopeType;\n}\n\nfunction channelOverlaps(left?: string, right?: string): boolean {\n return !left || !right || left === right;\n}\n\nfunction claimOverlaps(candidate: Pick<AgentClaim, 'project' | 'channel' | 'scope_type' | 'target_id'>, existing: AgentClaim): boolean {\n if (candidate.project !== existing.project) return false;\n if (!channelOverlaps(candidate.channel, existing.channel)) return false;\n if (candidate.scope_type === existing.scope_type && candidate.target_id === existing.target_id) return true;\n return candidate.scope_type === 'project_channel' || existing.scope_type === 'project_channel';\n}\n\nfunction activeClaims(database: DatabaseSync, project?: string): AgentClaim[] {\n const rows = project\n ? database.prepare(\"select * from agent_claims where project_id = ? and status = 'active' order by heartbeat_at desc\").all(project)\n : database.prepare(\"select * from agent_claims where status = 'active' order by project_id, heartbeat_at desc\").all();\n return (rows as Row[]).map(row => rowToClaim(row));\n}\n\nfunction findClaimById(database: DatabaseSync, claimId: string, project?: string): AgentClaim | null {\n const row = project\n ? database.prepare('select * from agent_claims where project_id = ? and id = ?').get(project, claimId)\n : database.prepare('select * from agent_claims where id = ?').get(claimId);\n return row ? rowToClaim(row as Row) : null;\n}\n\nfunction findClaimRowByToken(database: DatabaseSync, claimToken: string): Row | null {\n const claimId = claimToken.split('.')[0];\n const row = database.prepare('select * from agent_claims where id = ?').get(claimId) as Row | undefined;\n if (!row) return null;\n return safeEqual(String(row.token_hash), tokenHash(claimToken)) ? row : null;\n}\n\nfunction denied(code: string, message: string, conflicts: AgentClaim[] = []): AgentClaimValidationResult {\n return { ok: false, code, message, conflicts };\n}\n\nfunction scopeAllowsWrite(claim: AgentClaim, scopeType: AgentClaimScopeType, targetId: string, writeKind: string): boolean {\n if (claim.scope_type === scopeType && claim.target_id === targetId) return true;\n if (claim.scope_type === 'project_channel') return true;\n if (claim.scope_type === 'lineage_workspace' && scopeType === 'lineage_workspace') return claim.target_id === targetId;\n if (claim.scope_type === 'content_queue_lane' && writeKind === 'content_queue_next') return true;\n return false;\n}\n\nexport function createAgentClaim(fields: CreateAgentClaimFields) {\n const project = fields.project.trim();\n const targetId = fields.targetId.trim();\n const agentName = fields.agentName.trim();\n if (!project) throw new AgentClaimError('Agent claim requires project');\n if (!targetId) throw new AgentClaimError('Agent claim requires target');\n if (!agentName) throw new AgentClaimError('Agent claim requires agent name');\n const scopeType = normalizeScope(fields.scopeType);\n const ttlSeconds = fields.ttlSeconds || defaultTtlSeconds;\n const database = lineageDb();\n try {\n ensureProject(database, project);\n expireActiveClaims(database);\n const candidate = { project, channel: fields.channel?.trim() || undefined, scope_type: scopeType, target_id: targetId };\n const conflicts = activeClaims(database, project).filter(claim => claimOverlaps(candidate, claim));\n if (conflicts.length > 0 && !fields.force) {\n throw new AgentClaimError('Target already has an active overlapping agent claim.', 409, 'target_already_claimed', conflicts);\n }\n if (conflicts.length > 0 && !fields.reason?.trim()) {\n throw new AgentClaimError('Overriding an active claim requires --reason.', 400, 'override_reason_required', conflicts);\n }\n const timestamp = nowIso();\n for (const conflict of conflicts) {\n database.prepare(`\n update agent_claims\n set status = 'revoked', revoked_at = ?, revoked_by = ?, override_reason = ?\n where id = ? and status = 'active'\n `).run(timestamp, agentName, fields.reason || null, conflict.id);\n recordEvent(database, conflict.id, 'revoked', agentName, fields.reason || 'Revoked by forced claim takeover.');\n recordEvent(database, conflict.id, 'conflict', agentName, `Overridden by ${agentName}.`, { new_claim_target: targetId });\n }\n const id = randomId('claim');\n const secret = randomBytes(24).toString('base64url');\n const claimToken = `${id}.${secret}`;\n const expiresAt = expiresAtFrom(timestamp, ttlSeconds);\n database.prepare(`\n insert into agent_claims (\n id, token_hash, project_id, channel, scope_type, target_id, target_title, agent_id, agent_name,\n agent_kind, thread_id, status, created_at, heartbeat_at, expires_at, metadata_json\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, ?, ?)\n `).run(\n id,\n tokenHash(claimToken),\n project,\n candidate.channel || null,\n scopeType,\n targetId,\n fields.targetTitle?.trim() || null,\n fields.agentId?.trim() || null,\n agentName,\n fields.agentKind?.trim() || 'codex',\n fields.threadId?.trim() || null,\n timestamp,\n timestamp,\n expiresAt,\n metadataJson(fields.metadata)\n );\n recordEvent(database, id, 'created', agentName, `Claimed ${scopeType} ${targetId}.`, { ttl_seconds: ttlSeconds });\n const claim = findClaimById(database, id);\n return { ok: true as const, claim, claim_token: claimToken, conflicts_revoked: conflicts.map(conflict => conflict.id) };\n } finally {\n database.close();\n }\n}\n\nexport function listAgentClaims(project?: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const rows = project\n ? database.prepare('select * from agent_claims where project_id = ? order by status, heartbeat_at desc').all(project)\n : database.prepare('select * from agent_claims order by project_id, status, heartbeat_at desc').all();\n return { ok: true as const, claims: (rows as Row[]).map(row => rowToClaim(row)), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n\nexport function inspectAgentClaim(claimId: string, project?: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n const events = database.prepare('select * from agent_claim_events where claim_id = ? order by created_at').all(claim.id) as Row[];\n return { ok: true as const, claim, events: events.map(eventToRow) };\n } finally {\n database.close();\n }\n}\n\nexport function heartbeatAgentClaim(claimToken: string, ttlSeconds = defaultTtlSeconds) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, claimToken);\n if (!row) throw new AgentClaimError('Unknown or invalid agent claim token.', 401, 'claim_token_invalid');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n const timestamp = nowIso();\n database.prepare('update agent_claims set heartbeat_at = ?, expires_at = ? where id = ?').run(timestamp, expiresAtFrom(timestamp, ttlSeconds), claim.id);\n recordEvent(database, claim.id, 'heartbeat', claim.agent_name, 'Claim heartbeat received.');\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function releaseAgentClaim(claimToken: string) {\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, claimToken);\n if (!row) throw new AgentClaimError('Unknown or invalid agent claim token.', 401, 'claim_token_invalid');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n const timestamp = nowIso();\n database.prepare(\"update agent_claims set status = 'released', released_at = ? where id = ?\").run(timestamp, claim.id);\n recordEvent(database, claim.id, 'released', claim.agent_name, 'Claim released by token holder.');\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function releaseStaleAgentClaim(project: string, claimId: string, fields: { actor?: string; confirmWrite: boolean; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Releasing a stale agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n if (!fields.reason?.trim()) throw new AgentClaimError('Releasing a stale agent claim requires a reason.', 400, 'reason_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n if (claim.status !== 'active' || claim.derived_state !== 'stale') {\n throw new AgentClaimError('Only stale active claims can be released without the claim token.', 409, 'claim_not_stale', [claim]);\n }\n const timestamp = nowIso();\n database.prepare(\"update agent_claims set status = 'released', released_at = ?, revoked_by = ?, override_reason = ? where id = ?\").run(timestamp, fields.actor || 'human', fields.reason, claim.id);\n recordEvent(database, claim.id, 'released', fields.actor || 'human', fields.reason);\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function revokeAgentClaim(project: string, claimId: string, fields: { actor?: string; confirmWrite: boolean; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Revoking an agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n if (!fields.reason?.trim()) throw new AgentClaimError('Revoking an agent claim requires a reason.', 400, 'reason_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n const timestamp = nowIso();\n database.prepare(`\n update agent_claims set status = 'revoked', revoked_at = ?, revoked_by = ?, override_reason = ?\n where id = ?\n `).run(timestamp, fields.actor || 'human', fields.reason, claim.id);\n recordEvent(database, claim.id, 'revoked', fields.actor || 'human', fields.reason);\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function revokeAgentClaimInDatabase(database: DatabaseSync, project: string, claimId: string, fields: { actor?: string; reason?: string }) {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n if (claim.status !== 'active') return claim;\n const timestamp = nowIso();\n database.prepare(`\n update agent_claims set status = 'revoked', revoked_at = ?, revoked_by = ?, override_reason = ?\n where id = ? and status = 'active'\n `).run(timestamp, fields.actor || 'human', fields.reason || null, claim.id);\n recordEvent(database, claim.id, 'revoked', fields.actor || 'human', fields.reason);\n return findClaimById(database, claim.id, project);\n}\n\nexport function transferAgentClaim(project: string, claimId: string, fields: { confirmWrite: boolean; toAgentName: string; actor?: string; reason?: string }) {\n if (!fields.confirmWrite) throw new AgentClaimError('Transferring an agent claim requires confirmWrite=true.', 400, 'confirm_write_required');\n const toAgentName = fields.toAgentName.trim();\n if (!toAgentName) throw new AgentClaimError('Transfer requires toAgentName.', 400, 'agent_name_required');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const claim = findClaimById(database, claimId, project);\n if (!claim) throw new AgentClaimError(`Unknown agent claim: ${claimId}`, 404, 'claim_not_found');\n if (claim.status !== 'active') throw new AgentClaimError(`Agent claim is ${claim.status}.`, 409, 'claim_not_active');\n database.prepare('update agent_claims set agent_name = ? where id = ?').run(toAgentName, claim.id);\n recordEvent(database, claim.id, 'transferred', fields.actor || 'human', fields.reason || `Transferred claim to ${toAgentName}.`, { to_agent_name: toAgentName });\n return { ok: true as const, claim: findClaimById(database, claim.id) };\n } finally {\n database.close();\n }\n}\n\nexport function recordAgentClaimWriteAllowed(claim: Pick<AgentClaim, 'id' | 'agent_name'>, fields: Pick<ValidateAgentClaimForWriteFields, 'dangerLevel' | 'targetId' | 'writeKind'>) {\n const database = lineageDb();\n try {\n recordEvent(database, claim.id, 'write_allowed', claim.agent_name, `${fields.writeKind} allowed.`, {\n danger_level: fields.dangerLevel,\n target_id: fields.targetId,\n write_kind: fields.writeKind,\n });\n return { ok: true as const };\n } finally {\n database.close();\n }\n}\n\nexport function validateAgentClaimForWrite(fields: ValidateAgentClaimForWriteFields): AgentClaimValidationResult {\n if (fields.dangerLevel === 'danger' && !fields.confirmWrite) {\n return denied('human_confirmation_required', 'Dangerous write requires explicit human confirmation.');\n }\n if (!fields.claimToken) return denied('claim_required', 'Mutating agent write requires a matching claim token.');\n const database = lineageDb();\n try {\n expireActiveClaims(database);\n const row = findClaimRowByToken(database, fields.claimToken);\n if (!row) return denied('claim_token_invalid', 'Unknown or invalid claim token.');\n const claim = rowToClaim(row);\n if (claim.status !== 'active') return denied('claim_not_active', `Agent claim is ${claim.status}.`);\n if (new Date(claim.expires_at).getTime() <= Date.now()) return denied('claim_expired', 'Agent claim has expired.');\n if (claim.project !== fields.project) return denied('claim_project_mismatch', `Claim project ${claim.project} does not match ${fields.project}.`, [claim]);\n if (fields.channel && claim.channel && claim.channel !== fields.channel) {\n return denied('claim_channel_mismatch', `Claim channel ${claim.channel} does not match ${fields.channel}.`, [claim]);\n }\n if (!scopeAllowsWrite(claim, fields.scopeType, fields.targetId, fields.writeKind)) {\n return denied('claim_scope_mismatch', `Claim does not cover ${fields.scopeType} ${fields.targetId}.`, [claim]);\n }\n if (fields.recordEvent !== false) {\n recordEvent(database, claim.id, 'write_allowed', claim.agent_name, `${fields.writeKind} allowed.`, {\n danger_level: fields.dangerLevel,\n target_id: fields.targetId,\n write_kind: fields.writeKind,\n });\n }\n return { ok: true, claim, warnings: [] };\n } finally {\n database.close();\n }\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { cancelLineageIterateTasksForAssets } from './assetLineageTasks';\nimport type {\n LineageWorkspace,\n LineageWorkspaceActor,\n LineageWorkspaceFields,\n LineageWorkspaceSnapshot,\n LineageWorkspaceStatus,\n LineageWorkspaceUpdateFields,\n} from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nconst actors = new Set<LineageWorkspaceActor>(['human', 'agent', 'system']);\nconst statuses = new Set<LineageWorkspaceStatus>(['active', 'paused', 'archived']);\n\nexport class LineageWorkspaceError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isLineageWorkspaceError(error: unknown): error is LineageWorkspaceError {\n return error instanceof LineageWorkspaceError;\n}\n\nexport function lineageWorkspaceId(project: string, rootAssetId: string): string {\n return `${project}:lineage-workspace:${rootAssetId}`;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction normalizeStatus(value: LineageWorkspaceStatus | undefined, fallback: LineageWorkspaceStatus): LineageWorkspaceStatus {\n const status = value || fallback;\n if (!statuses.has(status)) throw new LineageWorkspaceError(`Unsupported lineage workspace status: ${status}`);\n return status;\n}\n\nfunction normalizeActor(value: LineageWorkspaceActor | undefined): LineageWorkspaceActor {\n const actor = value || 'human';\n if (!actors.has(actor)) throw new LineageWorkspaceError(`Unsupported lineage workspace actor: ${actor}`);\n return actor;\n}\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): { id: string; title: string } {\n const row = database.prepare('select id, title from assets where project_id = ? and id = ?').get(project, assetId) as { id: string; title: string } | undefined;\n if (!row) throw new LineageWorkspaceError(`Unknown indexed asset: ${assetId}`, 404);\n return row;\n}\n\nfunction rowToWorkspace(row: Row): LineageWorkspace {\n return {\n id: String(row.id),\n project: String(row.project_id),\n root_asset_id: String(row.root_asset_id),\n title: String(row.title),\n status: String(row.status) as LineageWorkspaceStatus,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_by: String(row.created_by) as LineageWorkspaceActor,\n active_at: typeof row.active_at === 'string' ? row.active_at : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction workspaceById(database: DatabaseSync, project: string, id: string): LineageWorkspace | null {\n const row = database.prepare('select * from lineage_workspaces where project_id = ? and id = ?').get(project, id) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nfunction workspaceByRoot(database: DatabaseSync, project: string, rootAssetId: string): LineageWorkspace | null {\n const row = database.prepare('select * from lineage_workspaces where project_id = ? and root_asset_id = ?').get(project, rootAssetId) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nfunction knownRoots(database: DatabaseSync, project: string): Array<{ root_asset_id: string; selected_at?: string }> {\n const rows = database.prepare(`\n select root_asset_id, max(selected_at) selected_at from asset_selections where project_id = ? group by root_asset_id\n union\n select root_asset_id, null selected_at from asset_layouts where project_id = ? group by root_asset_id\n union\n select parent_asset_id root_asset_id, null selected_at\n from asset_edges\n where project_id = ?\n and parent_asset_id not in (select child_asset_id from asset_edges where project_id = ?)\n group by parent_asset_id\n `).all(project, project, project, project) as Array<{ root_asset_id: string; selected_at?: string | null }>;\n return rows.map(row => ({ root_asset_id: row.root_asset_id, selected_at: row.selected_at || undefined }));\n}\n\nfunction seedLegacyWorkspaces(database: DatabaseSync, project: string): void {\n ensureProject(database, project);\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into lineage_workspaces (\n id, project_id, root_asset_id, title, status, notes, created_by, active_at, created_at, updated_at\n )\n select ?, ?, a.id, a.title || ' lineage', 'active', null, 'system', ?, ?, ?\n from assets a\n where a.project_id = ? and a.id = ?\n on conflict(project_id, root_asset_id) do nothing\n `);\n for (const root of knownRoots(database, project)) {\n statement.run(\n lineageWorkspaceId(project, root.root_asset_id),\n project,\n root.selected_at || null,\n timestamp,\n timestamp,\n project,\n root.root_asset_id\n );\n }\n}\n\nfunction listRows(database: DatabaseSync, project: string): LineageWorkspace[] {\n return (database.prepare(`\n select * from lineage_workspaces\n where project_id = ?\n order by\n case status when 'active' then 0 when 'paused' then 1 else 2 end,\n active_at desc nulls last,\n updated_at desc,\n title\n `).all(project) as Row[]).map(rowToWorkspace);\n}\n\nfunction activeWorkspace(database: DatabaseSync, project: string): LineageWorkspace | null {\n const row = database.prepare(`\n select * from lineage_workspaces\n where project_id = ? and status != 'archived'\n order by active_at desc nulls last, updated_at desc\n limit 1\n `).get(project) as Row | undefined;\n return row ? rowToWorkspace(row) : null;\n}\n\nexport function listLineageWorkspaces(project: string): LineageWorkspaceSnapshot {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n return {\n project,\n active_workspace: activeWorkspace(database, project),\n workspaces: listRows(database, project),\n fetchedAt: nowIso(),\n };\n } finally {\n database.close();\n }\n}\n\nexport function inspectLineageWorkspace(project: string, workspaceId: string): LineageWorkspace {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const workspace = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!workspace) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n return workspace;\n } finally {\n database.close();\n }\n}\n\nexport function createLineageWorkspace(project: string, fields: LineageWorkspaceFields) {\n const rootAssetId = fields.rootAssetId.trim();\n if (!rootAssetId) throw new LineageWorkspaceError('Lineage workspace requires rootAssetId');\n const status = normalizeStatus(fields.status, 'active');\n const actor = normalizeActor(fields.createdBy);\n const database = lineageDb();\n try {\n const root = requireAsset(database, project, rootAssetId);\n const timestamp = nowIso();\n const workspace: LineageWorkspace = {\n id: lineageWorkspaceId(project, rootAssetId),\n project,\n root_asset_id: rootAssetId,\n title: fields.title?.trim() || `${root.title} lineage`,\n status,\n notes: fields.notes?.trim() || undefined,\n created_by: actor,\n active_at: fields.activate !== false && status !== 'archived' ? timestamp : undefined,\n created_at: timestamp,\n updated_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, workspace };\n ensureProject(database, project);\n database.prepare(`\n insert into lineage_workspaces (\n id, project_id, root_asset_id, title, status, notes, created_by, active_at, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, root_asset_id) do update set\n title = excluded.title,\n status = excluded.status,\n notes = excluded.notes,\n active_at = coalesce(excluded.active_at, lineage_workspaces.active_at),\n updated_at = excluded.updated_at\n `).run(\n workspace.id,\n project,\n workspace.root_asset_id,\n workspace.title,\n workspace.status,\n workspace.notes || null,\n workspace.created_by,\n workspace.active_at || null,\n workspace.created_at,\n workspace.updated_at\n );\n return {\n ok: true as const,\n message: `Saved lineage workspace ${workspace.title}`,\n workspace: workspaceById(database, project, workspace.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function updateLineageWorkspace(project: string, workspaceId: string, fields: LineageWorkspaceUpdateFields) {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const current = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!current) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n const timestamp = nowIso();\n const next: LineageWorkspace = {\n ...current,\n title: fields.title?.trim() || current.title,\n status: normalizeStatus(fields.status, current.status),\n notes: fields.notes === undefined ? current.notes : fields.notes.trim() || undefined,\n active_at: fields.activate ? timestamp : current.active_at,\n updated_at: timestamp,\n };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, workspace: next };\n database.prepare(`\n update lineage_workspaces\n set title = ?, status = ?, notes = ?, active_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(next.title, next.status, next.notes || null, next.active_at || null, timestamp, project, current.id);\n return {\n ok: true as const,\n message: `Updated lineage workspace ${next.title}`,\n workspace: workspaceById(database, project, current.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function activateLineageWorkspace(project: string, workspaceId: string, confirmWrite: boolean) {\n return updateLineageWorkspace(project, workspaceId, { activate: true, status: 'active', confirmWrite });\n}\n\nexport function archiveLineageWorkspace(project: string, workspaceId: string, confirmWrite: boolean) {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n const current = workspaceById(database, project, workspaceId) || workspaceByRoot(database, project, workspaceId);\n if (!current) throw new LineageWorkspaceError(`Unknown lineage workspace: ${workspaceId}`, 404);\n const timestamp = nowIso();\n const next: LineageWorkspace = {\n ...current,\n status: 'archived',\n active_at: undefined,\n updated_at: timestamp,\n };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, workspace: next };\n cancelLineageIterateTasksForAssets(project, {\n actor: 'human',\n confirmWrite: true,\n rootAssetId: current.root_asset_id,\n });\n database.prepare(`\n update lineage_workspaces\n set status = 'archived', active_at = null, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, project, current.id);\n database.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, current.root_asset_id);\n return {\n ok: true as const,\n message: `Archived lineage workspace ${current.title}`,\n workspace: workspaceById(database, project, current.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function activeLineageWorkspaceRoot(project: string): string | undefined {\n const database = lineageDb();\n try {\n seedLegacyWorkspaces(database, project);\n return activeWorkspace(database, project)?.root_asset_id;\n } finally {\n database.close();\n }\n}\n", "import { AgentClaimError, listAgentClaims, validateAgentClaimForWrite } from './agentClaims';\nimport { lineageWorkspaceId } from './assetLineageWorkspaces';\n\nfunction channelOverlaps(left?: string, right?: string): boolean {\n return !left || !right || left === right;\n}\n\nfunction hasActiveLineageWorkspaceClaim(project: string, targetId: string, channel?: string): boolean {\n return listAgentClaims(project).claims.some(claim => {\n if (claim.project !== project || claim.status !== 'active' || claim.derived_state === 'expired') return false;\n if (claim.scope_type === 'lineage_workspace') return claim.target_id === targetId;\n return claim.scope_type === 'project_channel' && channelOverlaps(channel, claim.channel);\n });\n}\n\nexport function requireLineageWorkspaceClaimForWrite(fields: {\n channel?: string;\n claimToken?: string;\n confirmWrite: boolean;\n project: string;\n rootAssetId: string;\n writeKind: string;\n}): void {\n if (!fields.confirmWrite) return;\n const targetId = lineageWorkspaceId(fields.project, fields.rootAssetId);\n if (!fields.claimToken && !hasActiveLineageWorkspaceClaim(fields.project, targetId, fields.channel)) return;\n const validation = validateAgentClaimForWrite({\n channel: fields.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n dangerLevel: 'enforce',\n project: fields.project,\n scopeType: 'lineage_workspace',\n targetId,\n writeKind: fields.writeKind,\n });\n if (!validation.ok) {\n const status = validation.code === 'claim_required' || validation.code === 'claim_token_invalid' ? 401 : 409;\n throw new AgentClaimError(validation.message, status, validation.code, validation.conflicts);\n }\n}\n", "import type { LineageBriefResponse, LineageSelectedChildFields } from '../shared/types';\nimport { AgentClaimError, validateAgentClaimForWrite } from './agentClaims';\nimport { getLineageNextAsset, getLineageWriteClaimContext, LineageError, linkLineageAssets, listLineageRerollRequests } from './assetLineage';\nimport { lineageDbPath, nowIso } from './assetLineageDb';\nimport { lineageWorkspaceId } from './assetLineageWorkspaces';\n\nconst publicPackageCommand = 'npx @mean-weasel/lineage';\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction lineageCommand(command: string, project: string, rootAssetId: string): string {\n return `${publicPackageCommand} ${command} --project ${shellQuote(project)} --root ${shellQuote(rootAssetId)} --db ${shellQuote(lineageDbPath())} --json`;\n}\n\nfunction linkChildCommand(project: string, rootAssetId: string): string {\n return `${publicPackageCommand} link-child --project ${shellQuote(project)} --root ${shellQuote(rootAssetId)} --child <asset-id> --confirm-write --db ${shellQuote(lineageDbPath())} --json`;\n}\n\nfunction rerollImportGuidance(rootAssetId: string, targetAssetId: string): string {\n return `Use lineage reroll plan --root ${rootAssetId} --target ${targetAssetId} and lineage reroll import instead.`;\n}\n\nexport function getLineageBrief(project: string, rootAssetId?: string): LineageBriefResponse {\n const next = getLineageNextAsset(project, rootAssetId);\n const assets = next.next_assets;\n const asset = next.next_asset;\n const referenceAssetIds = assets.map(item => item.asset_id);\n const rationale = next.selections.map(selection => selection.notes).find(Boolean) || asset?.selection_note || next.selection?.notes;\n const channels = [...new Set(assets.map(item => item.channel || 'unknown'))];\n const campaigns = [...new Set(assets.map(item => item.campaign || 'unknown'))];\n const prompt = assets.length > 0\n ? [\n assets.length === 1\n ? `Create 3-4 variations from asset ${assets[0].asset_id} (${assets[0].title}).`\n : `Create 3-4 variations using these ${assets.length} selected references: ${referenceAssetIds.join(', ')}.`,\n rationale ? `Preserve this selection rationale: ${rationale}` : 'Preserve the strongest visible ideas while exploring distinct alternatives.',\n `Keep project=${project}, root=${next.root_asset_id}, channels=${channels.join(',')}, campaigns=${campaigns.join(',')}.`,\n 'After generation, index outputs and link chosen children with lineage link-child.',\n ].join(' ')\n : 'Select one to three latest lineage candidates before generating variations.';\n return {\n project,\n root_asset_id: next.root_asset_id,\n strategy: next.strategy,\n selection_mode: next.selection_mode,\n recommended_action: next.recommended_action,\n reason: next.reason,\n next_asset: asset,\n next_assets: assets,\n selection: next.selection,\n selections: next.selections,\n latest: next.latest,\n warnings: next.warnings,\n brief: {\n title: asset ? `Evolve ${assets.length > 1 ? `${assets.length} selected bases` : asset.title}` : 'Choose next lineage base',\n objective: asset ? 'Generate the next branch of visual variations from the selected lineage base or bases.' : 'Resolve the next base before generation.',\n prompt,\n reference_asset_id: asset?.asset_id,\n reference_asset_ids: referenceAssetIds,\n rationale,\n },\n handoff: {\n next_command: lineageCommand('next', project, next.root_asset_id),\n inspect_command: asset ? `${publicPackageCommand} inspect --project ${shellQuote(project)} --asset-id ${shellQuote(asset.asset_id)} --db ${shellQuote(lineageDbPath())} --json` : undefined,\n link_child_command: asset ? linkChildCommand(project, next.root_asset_id) : undefined,\n },\n fetchedAt: nowIso(),\n };\n}\n\nexport function linkSelectedLineageChild(project: string, fields: LineageSelectedChildFields) {\n const next = getLineageNextAsset(project, fields.rootAssetId);\n if (!next.next_asset) throw new LineageError('Cannot link child until a next base is selected or unambiguous');\n const rerollRequests = listLineageRerollRequests(project, next.root_asset_id).requests;\n const pendingRerollForParent = rerollRequests.find(request => request.node_asset_id === next.next_asset?.asset_id);\n if (pendingRerollForParent && fields.confirmWrite) {\n throw new LineageError(\n `Pending re-roll exists for ${pendingRerollForParent.node_asset_id}. lineage link-child creates a visible child variation edge; it does not re-roll the same node. ${rerollImportGuidance(next.root_asset_id, pendingRerollForParent.node_asset_id)} Cancel the re-roll first if you intentionally want a new child variation.`,\n 409\n );\n }\n if (fields.confirmWrite) {\n const claimContext = getLineageWriteClaimContext(project, next.next_asset.asset_id);\n const validation = validateAgentClaimForWrite({\n channel: claimContext.channel,\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n dangerLevel: 'enforce',\n project,\n scopeType: 'lineage_workspace',\n targetId: lineageWorkspaceId(project, claimContext.rootAssetId),\n writeKind: 'link_child',\n });\n if (!validation.ok) throw new AgentClaimError(validation.message, validation.code === 'claim_required' ? 401 : 403, validation.code, validation.conflicts);\n }\n const result = linkLineageAssets(project, {\n childAssetId: fields.childAssetId,\n confirmWrite: fields.confirmWrite,\n claimToken: fields.claimToken,\n parentAssetId: next.next_asset.asset_id,\n });\n return {\n ...result,\n root_asset_id: next.root_asset_id,\n parent_asset_id: next.next_asset.asset_id,\n child_asset_id: fields.childAssetId,\n reference_asset_ids: next.next_assets.map(asset => asset.asset_id),\n warning: [\n pendingRerollForParent\n ? `Pending re-roll exists for ${pendingRerollForParent.node_asset_id}. link-child would create a visible child variation; use reroll plan/import to update the same node attempt.`\n : undefined,\n rerollRequests.length > 0 && !pendingRerollForParent\n ? `This lineage has ${rerollRequests.length} pending re-roll target(s). link-child is only for new visible child variations, not re-roll attempts.`\n : undefined,\n next.next_assets.length > 1\n ? 'Linked child to the primary selected base; add explicit edges to other selected references if the child derives from them too.'\n : undefined,\n ].filter(Boolean).join(' ') || undefined,\n };\n}\n", "import { lineageDb as db, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { selectedRows, selectionId } from './assetLineageSelection';\nimport { cancelLineageIterateTasksForAssets } from './assetLineageTasks';\nimport { getLineageSnapshot, LineageError } from './assetLineage';\nimport { requireLineageWorkspaceClaimForWrite } from './lineageClaimGuards';\nimport type { LineageRemoveNodeFields, LineageRemoveNodeResponse } from '../shared/types';\n\nfunction requireAsset(database: DatabaseSync, project: string, assetId: string): void {\n const row = database.prepare('select id from assets where project_id = ? and id = ?').get(project, assetId);\n if (!row) throw new LineageError(`Unknown indexed asset: ${assetId}`, 404);\n}\n\nfunction assetChannel(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select channel from assets where project_id = ? and id = ?').get(project, assetId) as { channel?: string } | undefined;\n return row?.channel;\n}\n\nfunction parentOf(database: DatabaseSync, project: string, assetId: string): string | undefined {\n const row = database.prepare('select parent_asset_id from asset_edges where project_id = ? and child_asset_id = ? order by created_at limit 1').get(project, assetId) as { parent_asset_id?: string } | undefined;\n return row?.parent_asset_id;\n}\n\nfunction rootFor(database: DatabaseSync, project: string, assetId: string): string {\n let root = assetId;\n const seen = new Set<string>();\n while (!seen.has(root)) {\n seen.add(root);\n const parent = parentOf(database, project, root);\n if (!parent) return root;\n root = parent;\n }\n return assetId;\n}\n\nfunction edgeId(project: string, parent: string, child: string): string {\n return `${project}:${parent}:derived_from:${child}`;\n}\n\nfunction compactSelectionsAfterRemove(database: DatabaseSync, project: string, root: string, assetId: string, timestamp: string): boolean {\n const current = selectedRows(database, project, root);\n const next = current.filter(row => row.asset_id !== assetId);\n if (next.length === current.length) return false;\n database.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, root);\n const insert = database.prepare(`\n insert into asset_selections (id, project_id, root_asset_id, asset_id, position, notes, selected_at)\n values (?, ?, ?, ?, ?, ?, ?)\n `);\n next.forEach((row, position) => {\n insert.run(selectionId(project, root, row.asset_id), project, root, row.asset_id, position, row.notes || null, timestamp);\n });\n return true;\n}\n\nexport function removeLineageNode(project: string, fields: LineageRemoveNodeFields): LineageRemoveNodeResponse {\n const database = db();\n requireAsset(database, project, fields.assetId);\n const root = fields.rootAssetId || rootFor(database, project, fields.assetId);\n requireAsset(database, project, root);\n if (fields.assetId === root) {\n database.close();\n throw new LineageError('Cannot remove the root lineage node; archive the workspace or create a new root instead.');\n }\n const snapshot = getLineageSnapshot(project, root);\n if (!snapshot.nodes.some(node => node.asset_id === fields.assetId)) {\n database.close();\n throw new LineageError(`Asset ${fields.assetId} is not in lineage rooted at ${root}`, 404);\n }\n try {\n requireLineageWorkspaceClaimForWrite({\n channel: assetChannel(database, project, root),\n claimToken: fields.claimToken,\n confirmWrite: fields.confirmWrite,\n project,\n rootAssetId: root,\n writeKind: 'lineage_remove_node',\n });\n } catch (error) {\n database.close();\n throw error;\n }\n const parentEdges = snapshot.edges.filter(edge => edge.child_asset_id === fields.assetId);\n const childEdges = snapshot.edges.filter(edge => edge.parent_asset_id === fields.assetId);\n const removedIds = [...parentEdges, ...childEdges].map(edge => edge.id);\n const timestamp = nowIso();\n const reparentedEdges = parentEdges.flatMap(parentEdge => childEdges\n .filter(childEdge => parentEdge.parent_asset_id !== childEdge.child_asset_id)\n .map(childEdge => ({\n id: edgeId(project, parentEdge.parent_asset_id, childEdge.child_asset_id),\n parent_asset_id: parentEdge.parent_asset_id,\n child_asset_id: childEdge.child_asset_id,\n relation_type: 'derived_from' as const,\n created_at: timestamp,\n })));\n const selectionRemoved = selectedRows(database, project, root).some(row => row.asset_id === fields.assetId);\n if (!fields.confirmWrite) {\n database.close();\n return {\n ok: true, dryRun: true, asset_id: fields.assetId, root_asset_id: root,\n removed_edge_ids: removedIds, reparented_edges: reparentedEdges, selection_removed: selectionRemoved, asset_preserved: true,\n };\n }\n if (selectionRemoved) {\n try {\n cancelLineageIterateTasksForAssets(project, {\n actor: 'human',\n assetIds: [fields.assetId],\n confirmWrite: true,\n rootAssetId: root,\n });\n } catch (error) {\n database.close();\n throw error;\n }\n }\n try {\n database.exec('begin immediate transaction');\n const deleteEdge = database.prepare('delete from asset_edges where id = ? and project_id = ?');\n for (const edgeIdToRemove of removedIds) deleteEdge.run(edgeIdToRemove, project);\n const insertEdge = database.prepare(`\n insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?)\n on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing\n `);\n for (const edge of reparentedEdges) insertEdge.run(edge.id, project, edge.parent_asset_id, edge.child_asset_id, edge.created_at);\n database.prepare('delete from asset_layouts where project_id = ? and root_asset_id = ? and asset_id = ?').run(project, root, fields.assetId);\n compactSelectionsAfterRemove(database, project, root, fields.assetId, timestamp);\n database.exec('commit');\n } catch (error) {\n database.exec('rollback');\n database.close();\n throw error;\n }\n database.close();\n return {\n ok: true, message: `Removed ${fields.assetId} from lineage ${root}`, asset_id: fields.assetId, root_asset_id: root,\n removed_edge_ids: removedIds, reparented_edges: reparentedEdges, selection_removed: selectionRemoved, asset_preserved: true,\n };\n}\n", "import { defaultProject, listAssets, repoRoot } from './assetCore';\nimport { lineageDb, lineageDbPath, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { ledgerWorkflowStates, upsertLedgerPlacementsForAsset, upsertLedgerWorkflowAsset } from './assetLedgerWorkflow';\nimport type {\n AssetLedgerIndexOptions,\n AssetLedgerIndexRun,\n AssetLedgerIndexSourceMode,\n AssetLedgerIndexSummary,\n AssetLedgerRecord,\n AssetLedgerSnapshot,\n AssetLedgerSource,\n AssetLedgerSourceType,\n GrowthAsset,\n ListAssetsOptions,\n} from '../shared/types';\n\ninterface LedgerRecordRow {\n id: string;\n project_id: string;\n canonical_asset_id: string;\n checksum_sha256: string | null;\n media_type: AssetLedgerRecord['media_type'];\n title: string;\n status: string;\n channel: string | null;\n campaign: string | null;\n audience: string | null;\n updated_at: string;\n first_seen_at: string | null;\n last_seen_at: string;\n indexed_by_run_id: string | null;\n}\n\ninterface LedgerSourceRow {\n id: string;\n record_id: string;\n source_type: AssetLedgerSourceType;\n asset_id: string | null;\n local_path: string | null;\n s3_bucket: string | null;\n s3_region: string | null;\n s3_key: string | null;\n s3_version_id: string | null;\n etag: string | null;\n size_bytes: number | null;\n content_type: string | null;\n updated_at: string | null;\n first_seen_at: string | null;\n last_seen_at: string;\n indexed_by_run_id: string | null;\n}\n\ninterface LedgerRunRow {\n id: string;\n project_id: string;\n source_mode: AssetLedgerIndexSourceMode;\n include_live_s3: number;\n status: AssetLedgerIndexRun['status'];\n started_at: string;\n completed_at: string | null;\n assets_indexed: number;\n records_after: number;\n catalog_sources_after: number;\n local_sources_after: number;\n s3_sources_after: number;\n error: string | null;\n}\n\ninterface IndexContext {\n runId?: string;\n seenAt?: string;\n}\n\nfunction allAssets(project: string, source: ListAssetsOptions['source']): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source }).assets);\n }\n return assets;\n}\n\nfunction sourceMode(options: AssetLedgerIndexOptions): AssetLedgerIndexSourceMode {\n if (!options.source || options.source === 'all') return 'all';\n if (options.source === 'catalog' || options.source === 'local') return options.source;\n throw new Error(`Unknown ledger source mode: ${options.source}`);\n}\n\nfunction assetsForIndex(project: string, mode: AssetLedgerIndexSourceMode): GrowthAsset[] {\n if (mode === 'catalog') return allAssets(project, 'catalog');\n if (mode === 'local') return allAssets(project, 'local');\n return [...allAssets(project, 'catalog'), ...allAssets(project, 'local')];\n}\n\nfunction recordId(project: string, asset: GrowthAsset): string {\n const checksum = asset.local?.checksum_sha256 || asset.s3?.checksum_sha256;\n return checksum ? `${project}:sha256:${checksum}` : `${project}:asset:${asset.asset_id}`;\n}\n\nfunction sourceId(project: string, record: string, sourceType: AssetLedgerSourceType, key: string): string {\n return `${project}:${record}:${sourceType}:${key}`;\n}\n\nfunction upsertProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, `${repoRoot}/${project}/assets/catalog.json`, timestamp, timestamp);\n}\n\nexport function upsertAssetLedgerAsset(database: DatabaseSync, project: string, asset: GrowthAsset, context: IndexContext = {}): void {\n const timestamp = context.seenAt || nowIso();\n const id = recordId(project, asset);\n const checksum = asset.local?.checksum_sha256 || asset.s3?.checksum_sha256 || null;\n upsertLedgerWorkflowAsset(database, project, asset, timestamp);\n database.prepare(`\n insert into asset_ledger_records (\n id, project_id, canonical_asset_id, checksum_sha256, media_type, title, status,\n channel, campaign, audience, created_at, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n canonical_asset_id = excluded.canonical_asset_id,\n checksum_sha256 = coalesce(asset_ledger_records.checksum_sha256, excluded.checksum_sha256),\n media_type = excluded.media_type,\n title = excluded.title,\n status = excluded.status,\n channel = excluded.channel,\n campaign = excluded.campaign,\n audience = excluded.audience,\n updated_at = excluded.updated_at,\n first_seen_at = coalesce(asset_ledger_records.first_seen_at, excluded.first_seen_at),\n last_seen_at = excluded.last_seen_at,\n indexed_by_run_id = excluded.indexed_by_run_id\n `).run(\n id, project, asset.asset_id, checksum, asset.content_type, asset.title, asset.status,\n asset.channel || null, asset.campaign || null, asset.audience || null,\n timestamp, timestamp, timestamp, timestamp, context.runId || null\n );\n if (asset.source !== 'local') upsertSource(database, project, id, 'catalog', asset, asset.asset_id, context);\n if (asset.local) upsertSource(database, project, id, 'local', asset, asset.local.relative_path, context);\n if (asset.s3) upsertSource(database, project, id, 's3', asset, asset.s3.key, context);\n upsertLedgerPlacementsForAsset(database, project, asset);\n}\n\nfunction upsertSource(\n database: DatabaseSync,\n project: string,\n record: string,\n sourceType: AssetLedgerSourceType,\n asset: GrowthAsset,\n key: string,\n context: IndexContext = {}\n): void {\n const timestamp = context.seenAt || nowIso();\n const id = sourceId(project, record, sourceType, key);\n database.prepare(`\n insert into asset_ledger_sources (\n id, project_id, record_id, source_type, asset_id, local_path, s3_bucket, s3_region,\n s3_key, s3_version_id, etag, size_bytes, content_type, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n asset_id = excluded.asset_id,\n local_path = excluded.local_path,\n s3_bucket = excluded.s3_bucket,\n s3_region = excluded.s3_region,\n s3_key = excluded.s3_key,\n s3_version_id = excluded.s3_version_id,\n etag = excluded.etag,\n size_bytes = excluded.size_bytes,\n content_type = excluded.content_type,\n updated_at = excluded.updated_at,\n first_seen_at = coalesce(asset_ledger_sources.first_seen_at, excluded.first_seen_at),\n last_seen_at = excluded.last_seen_at,\n indexed_by_run_id = excluded.indexed_by_run_id\n `).run(\n id, project, record, sourceType, asset.asset_id,\n sourceType === 'local' ? asset.local?.relative_path || null : null,\n sourceType === 's3' ? asset.s3?.bucket || null : null,\n sourceType === 's3' ? asset.s3?.region || null : null,\n sourceType === 's3' ? asset.s3?.key || null : null,\n sourceType === 's3' ? asset.s3?.version_id || null : null,\n sourceType === 's3' ? asset.s3?.etag || null : null,\n asset.local?.size_bytes || asset.s3?.size_bytes || null,\n asset.local?.content_type || asset.s3?.content_type || null,\n asset.local?.updated_at || asset.s3?.updated_at || null,\n timestamp, timestamp, context.runId || null\n );\n}\n\nexport function indexAssetLedger(project = defaultProject, options: AssetLedgerIndexOptions = {}): AssetLedgerIndexSummary {\n const mode = sourceMode(options);\n const database = lineageDb();\n const startedAt = nowIso();\n upsertProject(database, project);\n const runId = createIndexRun(database, project, mode, startedAt);\n try {\n const assets = assetsForIndex(project, mode);\n for (const asset of assets) upsertAssetLedgerAsset(database, project, asset, { runId, seenAt: startedAt });\n const summary = ledgerSummary(database, project, assets.length, mode);\n completeIndexRun(database, runId, summary, null);\n const run = latestIndexRun(database, project) as AssetLedgerIndexRun;\n database.close();\n return { ...summary, run };\n } catch (error) {\n completeIndexRun(database, runId, ledgerSummary(database, project, 0, mode), error instanceof Error ? error.message : String(error));\n database.close();\n throw error;\n }\n}\n\nfunction ledgerSummary(database: DatabaseSync, project: string, assetsIndexed: number, mode: AssetLedgerIndexSourceMode): Omit<AssetLedgerIndexSummary, 'run'> {\n const sources = sourceCounts(database, project);\n const recordRow = database.prepare('select count(*) count from asset_ledger_records where project_id = ?').get(project) as { count: number };\n return {\n project,\n database: lineageDbPath(),\n records: Number(recordRow.count),\n assets_indexed: assetsIndexed,\n source_mode: mode,\n include_live_s3: false,\n sources,\n fetchedAt: nowIso(),\n };\n}\n\nfunction createIndexRun(database: DatabaseSync, project: string, mode: AssetLedgerIndexSourceMode, startedAt: string): string {\n const id = `${project}:ledger-run:${startedAt}`;\n database.prepare(`\n insert into asset_ledger_index_runs (id, project_id, source_mode, include_live_s3, status, started_at)\n values (?, ?, ?, 0, 'running', ?)\n `).run(id, project, mode, startedAt);\n return id;\n}\n\nfunction completeIndexRun(\n database: DatabaseSync,\n runId: string,\n summary: Omit<AssetLedgerIndexSummary, 'run'>,\n error: string | null\n): void {\n database.prepare(`\n update asset_ledger_index_runs\n set status = ?, completed_at = ?, assets_indexed = ?, records_after = ?,\n catalog_sources_after = ?, local_sources_after = ?, s3_sources_after = ?, error = ?\n where id = ?\n `).run(\n error ? 'failed' : 'complete',\n nowIso(),\n summary.assets_indexed,\n summary.records,\n summary.sources.catalog,\n summary.sources.local,\n summary.sources.s3,\n error,\n runId\n );\n}\n\nfunction sourceCounts(database: DatabaseSync, project: string): Record<AssetLedgerSourceType, number> {\n const rows = database.prepare(`\n select source_type, count(*) count\n from asset_ledger_sources\n where project_id = ?\n group by source_type\n `).all(project) as Array<{ source_type: AssetLedgerSourceType; count: number }>;\n return {\n catalog: Number(rows.find(row => row.source_type === 'catalog')?.count || 0),\n local: Number(rows.find(row => row.source_type === 'local')?.count || 0),\n s3: Number(rows.find(row => row.source_type === 's3')?.count || 0),\n };\n}\n\nexport function getAssetLedgerSnapshot(project = defaultProject): AssetLedgerSnapshot {\n const database = lineageDb();\n const records = database.prepare(`\n select id, project_id, canonical_asset_id, checksum_sha256, media_type, title, status, channel,\n campaign, audience, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n from asset_ledger_records\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as unknown as LedgerRecordRow[];\n const sources = database.prepare(`\n select id, record_id, source_type, asset_id, local_path, s3_bucket, s3_region, s3_key,\n s3_version_id, etag, size_bytes, content_type, updated_at, first_seen_at, last_seen_at, indexed_by_run_id\n from asset_ledger_sources\n where project_id = ?\n order by source_type, id\n `).all(project) as unknown as LedgerSourceRow[];\n const totals = sourceCounts(database, project);\n const lastIndexRun = latestIndexRun(database, project);\n const sourceRecords = sources.map(toSource);\n const baseRecords = records.map(record => toRecord(record, sourceRecords.filter(source => source.record_id === record.id)));\n const workflows = ledgerWorkflowStates(database, project, baseRecords, sourceRecords);\n database.close();\n return {\n project,\n database: lineageDbPath(),\n records: baseRecords.map(record => ({ ...record, workflow: workflows[record.id] || { placements: [] } })),\n last_index_run: lastIndexRun,\n totals: {\n records: records.length,\n local: totals.local,\n catalog: totals.catalog,\n s3: totals.s3,\n },\n fetchedAt: nowIso(),\n };\n}\n\nfunction latestIndexRun(database: DatabaseSync, project: string): AssetLedgerIndexRun | undefined {\n const row = database.prepare(`\n select id, project_id, source_mode, include_live_s3, status, started_at, completed_at,\n assets_indexed, records_after, catalog_sources_after, local_sources_after, s3_sources_after, error\n from asset_ledger_index_runs\n where project_id = ?\n order by started_at desc, id desc\n limit 1\n `).get(project) as LedgerRunRow | undefined;\n return row ? toIndexRun(row) : undefined;\n}\n\nfunction toIndexRun(row: LedgerRunRow): AssetLedgerIndexRun {\n return {\n id: row.id,\n project: row.project_id,\n source_mode: row.source_mode,\n include_live_s3: Boolean(row.include_live_s3),\n status: row.status,\n started_at: row.started_at,\n completed_at: row.completed_at || undefined,\n assets_indexed: Number(row.assets_indexed),\n records_after: Number(row.records_after),\n sources_after: {\n catalog: Number(row.catalog_sources_after),\n local: Number(row.local_sources_after),\n s3: Number(row.s3_sources_after),\n },\n error: row.error || undefined,\n };\n}\n\nfunction toRecord(record: LedgerRecordRow, sources: AssetLedgerSource[]): AssetLedgerRecord {\n return {\n id: record.id,\n project: record.project_id,\n canonical_asset_id: record.canonical_asset_id,\n checksum_sha256: record.checksum_sha256 || undefined,\n media_type: record.media_type,\n title: record.title,\n status: record.status,\n channel: record.channel || undefined,\n campaign: record.campaign || undefined,\n audience: record.audience || undefined,\n updated_at: record.updated_at,\n first_seen_at: record.first_seen_at || undefined,\n last_seen_at: record.last_seen_at,\n indexed_by_run_id: record.indexed_by_run_id || undefined,\n sources,\n workflow: { placements: [] },\n };\n}\n\nfunction toSource(source: LedgerSourceRow): AssetLedgerSource {\n return {\n id: source.id,\n record_id: source.record_id,\n source_type: source.source_type,\n asset_id: source.asset_id || undefined,\n local_path: source.local_path || undefined,\n s3_bucket: source.s3_bucket || undefined,\n s3_region: source.s3_region || undefined,\n s3_key: source.s3_key || undefined,\n s3_version_id: source.s3_version_id || undefined,\n etag: source.etag || undefined,\n size_bytes: source.size_bytes || undefined,\n content_type: source.content_type || undefined,\n updated_at: source.updated_at || undefined,\n first_seen_at: source.first_seen_at || undefined,\n last_seen_at: source.last_seen_at,\n indexed_by_run_id: source.indexed_by_run_id || undefined,\n };\n}\n", "import { getAssetLedgerSnapshot, indexAssetLedger } from './assetLedger';\nimport type { AssetLedgerIndexSourceMode, AssetLedgerRecord, AssetReviewState, PlacementStatus } from '../shared/types';\n\nexport type LedgerStorageFilter = 'all' | 'local-only' | 's3-backed' | 'local-and-s3' | 'catalog-only';\nexport type LedgerReviewFilter = 'all' | AssetReviewState;\nexport type LedgerPlacementFilter = 'all' | PlacementStatus | 'not-posted' | 'not-scheduled';\nexport type LedgerSelectionFilter = 'all' | 'selected' | 'not-selected';\n\nexport interface LedgerPageOptions {\n page?: number;\n pageSize?: number;\n placement?: LedgerPlacementFilter;\n query?: string;\n refresh?: boolean;\n review?: LedgerReviewFilter;\n selection?: LedgerSelectionFilter;\n source?: AssetLedgerIndexSourceMode;\n storage?: LedgerStorageFilter;\n}\n\nconst storageFilters = new Set<LedgerStorageFilter>(['all', 'local-only', 's3-backed', 'local-and-s3', 'catalog-only']);\nconst reviewFilters = new Set<LedgerReviewFilter>(['all', 'unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\nconst placementFilters = new Set<LedgerPlacementFilter>(['all', 'planned', 'scheduled', 'posted', 'skipped', 'not-posted', 'not-scheduled']);\nconst selectionFilters = new Set<LedgerSelectionFilter>(['all', 'selected', 'not-selected']);\n\nfunction normalizeFilter<T extends string>(value: unknown, allowed: Set<T>, fallback: T): T {\n return typeof value === 'string' && allowed.has(value as T) ? value as T : fallback;\n}\n\nfunction sourceTypes(record: AssetLedgerRecord) {\n return new Set(record.sources.map(source => source.source_type));\n}\n\nfunction matchesStorage(record: AssetLedgerRecord, storage: LedgerStorageFilter): boolean {\n const types = sourceTypes(record);\n if (storage === 'local-only') return types.has('local') && !types.has('s3');\n if (storage === 's3-backed') return types.has('s3');\n if (storage === 'local-and-s3') return types.has('local') && types.has('s3');\n if (storage === 'catalog-only') return types.has('catalog') && !types.has('local') && !types.has('s3');\n return true;\n}\n\nfunction matchesPlacement(record: AssetLedgerRecord, placement: LedgerPlacementFilter): boolean {\n if (placement === 'not-scheduled') return record.workflow.placements.length === 0;\n if (placement === 'not-posted') return !record.workflow.placements.some(item => item.status === 'posted');\n if (placement === 'all') return true;\n return record.workflow.placements.some(item => item.status === placement);\n}\n\nfunction matchesSelection(record: AssetLedgerRecord, selection: LedgerSelectionFilter): boolean {\n if (selection === 'selected') return Boolean(record.workflow.selection);\n if (selection === 'not-selected') return !record.workflow.selection;\n return true;\n}\n\nfunction filterLedgerRecords(records: AssetLedgerRecord[], options: LedgerPageOptions = {}) {\n const placement = normalizeFilter(options.placement, placementFilters, 'all');\n const review = normalizeFilter(options.review, reviewFilters, 'all');\n const selection = normalizeFilter(options.selection, selectionFilters, 'all');\n const storage = normalizeFilter(options.storage, storageFilters, 'all');\n const query = options.query?.trim().toLowerCase() || '';\n return records.filter(record => {\n if (!matchesStorage(record, storage)) return false;\n if (review !== 'all' && (record.workflow.review?.review_state || 'unreviewed') !== review) return false;\n if (!matchesPlacement(record, placement)) return false;\n if (!matchesSelection(record, selection)) return false;\n if (!query) return true;\n return [\n record.canonical_asset_id,\n record.title,\n record.status,\n record.channel,\n record.campaign,\n record.audience,\n record.workflow.review?.review_state,\n ...record.workflow.placements.map(item => `${item.channel} ${item.status}`),\n ].join(' ').toLowerCase().includes(query);\n });\n}\n\nexport function getLedgerPage(project: string, options: LedgerPageOptions = {}) {\n const pageSize = Math.min(Math.max(Number(options.pageSize || 25), 1), 100);\n const page = Math.max(Number(options.page || 1), 1);\n const indexSummary = options.refresh ? indexAssetLedger(project, { source: options.source || 'all' }) : undefined;\n const snapshot = getAssetLedgerSnapshot(project);\n const records = filterLedgerRecords(snapshot.records, options);\n const totalPages = Math.max(Math.ceil(records.length / pageSize), 1);\n const safePage = Math.min(page, totalPages);\n const start = (safePage - 1) * pageSize;\n return {\n ...snapshot,\n records: records.slice(start, start + pageSize),\n index_summary: indexSummary,\n pagination: { page: safePage, pageSize, total: records.length, totalPages },\n };\n}\n\nexport function getLedgerPageFromQuery(project: string, query: Record<string, unknown>) {\n return getLedgerPage(project, {\n page: Number(query.page || 1),\n pageSize: Number(query.pageSize || 25),\n placement: normalizeFilter(query.placement, placementFilters, 'all'),\n query: typeof query.q === 'string' ? query.q : undefined,\n refresh: query.refresh === 'true',\n review: normalizeFilter(query.review, reviewFilters, 'all'),\n selection: normalizeFilter(query.selection, selectionFilters, 'all'),\n source: typeof query.source === 'string' ? query.source as AssetLedgerIndexSourceMode : 'all',\n storage: normalizeFilter(query.storage, storageFilters, 'all'),\n });\n}\n", "import type { SQLOutputValue } from 'node:sqlite';\nimport { indexLineageAssets, updateAssetReview } from './assetLineage';\nimport { lineageDb } from './assetLineageDb';\nimport { listAssets } from './assetCore';\nimport type { AssetLibrarySnapshot, AssetReviewState, BatchReviewFields, BatchReviewResponse, GrowthAsset, ReviewFields } from '../shared/types';\n\nexport interface AssetReviewSummary {\n asset_id: string;\n review_state: AssetReviewState;\n reviewed_at?: string;\n ignored_at?: string;\n notes?: string;\n updated_at: string;\n}\n\ninterface AssetReviewDbRow {\n asset_id: string;\n review_state: AssetReviewState;\n reviewed_at: string | null;\n ignored_at: string | null;\n notes: string | null;\n updated_at: string;\n}\n\nconst reviewStates = new Set<AssetReviewState>(['unreviewed', 'approved', 'needs_revision', 'rejected', 'ignored']);\n\nclass AssetReviewError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetReviewError(error: unknown): error is AssetReviewError {\n return error instanceof AssetReviewError;\n}\n\nfunction stringColumn(row: Record<string, SQLOutputValue>, column: keyof AssetReviewDbRow): string {\n const value = row[column];\n if (typeof value !== 'string') throw new TypeError(`Invalid asset review row column: ${column}`);\n return value;\n}\n\nfunction nullableStringColumn(row: Record<string, SQLOutputValue>, column: keyof AssetReviewDbRow): string | null {\n const value = row[column];\n if (value === null || typeof value === 'string') return value;\n throw new TypeError(`Invalid asset review row column: ${column}`);\n}\n\nfunction toAssetReviewDbRow(row: Record<string, SQLOutputValue>): AssetReviewDbRow {\n const reviewState = stringColumn(row, 'review_state');\n if (!reviewStates.has(reviewState as AssetReviewState)) throw new TypeError(`Invalid asset review state: ${reviewState}`);\n return {\n asset_id: stringColumn(row, 'asset_id'),\n review_state: reviewState as AssetReviewState,\n reviewed_at: nullableStringColumn(row, 'reviewed_at'),\n ignored_at: nullableStringColumn(row, 'ignored_at'),\n notes: nullableStringColumn(row, 'notes'),\n updated_at: stringColumn(row, 'updated_at'),\n };\n}\n\nfunction toAssetReviewSummary(row: AssetReviewDbRow): AssetReviewSummary {\n return {\n asset_id: row.asset_id,\n review_state: row.review_state,\n reviewed_at: row.reviewed_at ?? undefined,\n ignored_at: row.ignored_at ?? undefined,\n notes: row.notes ?? undefined,\n updated_at: row.updated_at,\n };\n}\n\nexport function getAssetReviewMap(project: string, assetIds: string[]): Record<string, AssetReviewSummary> {\n if (assetIds.length === 0) return {};\n indexLineageAssets(project);\n const database = lineageDb();\n try {\n const placeholders = assetIds.map(() => '?').join(',');\n const rows = database.prepare(`\n select asset_id, review_state, reviewed_at, ignored_at, notes, updated_at\n from asset_reviews\n where asset_id in (${placeholders})\n `).all(...assetIds).map(toAssetReviewDbRow);\n return Object.fromEntries(rows.map(row => [row.asset_id, toAssetReviewSummary(row)]));\n } finally {\n database.close();\n }\n}\n\nexport function markAssetReview(project: string, fields: ReviewFields) {\n indexLineageAssets(project);\n return updateAssetReview(project, fields);\n}\n\nfunction localAssetIds(project: string): Set<string> {\n return new Set(localAssets(project).map(asset => asset.asset_id));\n}\n\nfunction localAssets(project: string): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source: 'local' });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source: 'local' }).assets);\n }\n return assets;\n}\n\nfunction uniqueAssetIds(assetIds: string[]): string[] {\n const ids = assetIds.map(assetId => assetId.trim()).filter(Boolean);\n return [...new Set(ids)];\n}\n\nexport function markAssetReviews(project: string, fields: BatchReviewFields): BatchReviewResponse {\n if (!reviewStates.has(fields.reviewState)) throw new AssetReviewError(`Unsupported local review state: ${fields.reviewState}`);\n const assetIds = uniqueAssetIds(fields.assetIds);\n if (assetIds.length < 1) throw new AssetReviewError('Batch local review requires at least one asset id');\n const knownLocalIds = localAssetIds(project);\n const unknownIds = assetIds.filter(assetId => !knownLocalIds.has(assetId));\n if (unknownIds.length > 0) throw new AssetReviewError(`Unknown local asset${unknownIds.length === 1 ? '' : 's'}: ${unknownIds.join(', ')}`, 404);\n\n if (!fields.confirmWrite) {\n const results = assetIds.map(assetId => ({\n asset_id: assetId,\n dryRun: true as const,\n notes: fields.notes,\n review_state: fields.reviewState,\n }));\n return {\n ok: true,\n dryRun: true,\n message: `Would mark ${assetIds.length} local asset${assetIds.length === 1 ? '' : 's'} ${fields.reviewState}`,\n review_state: fields.reviewState,\n notes: fields.notes,\n count: results.length,\n results,\n };\n }\n\n indexLineageAssets(project);\n const results = assetIds.map(assetId => {\n const result = updateAssetReview(project, {\n assetId,\n confirmWrite: true,\n notes: fields.notes,\n reviewState: fields.reviewState,\n });\n return {\n asset_id: result.asset_id,\n message: result.message,\n notes: fields.notes,\n review_state: result.review_state,\n };\n });\n return {\n ok: true,\n message: `Marked ${results.length} local asset${results.length === 1 ? '' : 's'} ${fields.reviewState}`,\n review_state: fields.reviewState,\n notes: fields.notes,\n count: results.length,\n results,\n };\n}\n\nfunction normalizeReviewState(value: unknown): AssetReviewState {\n const rawState = typeof value === 'string' ? value : 'unreviewed';\n return rawState.replace(/-/g, '_') as AssetReviewState;\n}\n\nfunction batchReviewFieldsFromRequestBody(body: Record<string, unknown>): BatchReviewFields {\n if (!Array.isArray(body.assetIds)) throw new AssetReviewError('Batch local review requires assetIds array');\n const badAssetId = body.assetIds.find(assetId => typeof assetId !== 'string');\n if (badAssetId !== undefined) throw new AssetReviewError('Batch local review assetIds must be strings');\n return {\n assetIds: body.assetIds,\n reviewState: normalizeReviewState(body.reviewState || body.state),\n notes: typeof body.notes === 'string' ? body.notes : undefined,\n confirmWrite: body.confirmWrite === true && body.dryRun !== true,\n };\n}\n\nexport function markAssetReviewsFromRequestBody(project: string, body: Record<string, unknown>): BatchReviewResponse {\n return markAssetReviews(project, batchReviewFieldsFromRequestBody(body));\n}\n\nexport function requireApprovedLocalBackup(project: string, asset: GrowthAsset): AssetReviewSummary {\n if (!asset.local?.relative_path) throw new AssetReviewError(`Asset is not local-only: ${asset.asset_id}`);\n const review = getAssetReviewMap(project, [asset.asset_id])[asset.asset_id];\n if (review?.review_state !== 'approved') throw new AssetReviewError(`Local backup requires approved local review for ${asset.asset_id}`, 403);\n return review;\n}\n\nexport function requireApprovedLocalBackupPath(project: string, relativePath: string): GrowthAsset {\n const asset = localAssets(project).find(item => item.local?.relative_path === relativePath);\n if (!asset) throw new AssetReviewError(`Unknown local asset path: ${relativePath}`, 404);\n requireApprovedLocalBackup(project, asset);\n return asset;\n}\n\nexport function withLocalReviewMetadata(project: string, snapshot: AssetLibrarySnapshot): AssetLibrarySnapshot {\n const localAssetIds = snapshot.assets.filter(asset => asset.local?.relative_path).map(asset => asset.asset_id);\n const reviewMap = getAssetReviewMap(project, localAssetIds);\n return {\n ...snapshot,\n assets: snapshot.assets.map(asset => {\n const review = reviewMap[asset.asset_id];\n if (!asset.local?.relative_path || !review) return asset;\n return { ...asset, review: { notes: review.notes, review_state: review.review_state, updated_at: review.updated_at } };\n }),\n };\n}\n", "import { defaultProject, listAssets } from './assetCore';\nimport { getAssetReviewMap } from './assetReviews';\nimport type { GrowthAsset, ListAssetsOptions, ReviewQueueLane, ReviewQueueSnapshot, ReviewableAsset } from '../shared/types';\n\ninterface QueueOptions {\n channel?: string;\n limit?: number;\n}\n\nfunction allAssets(project: string, source: ListAssetsOptions['source']): GrowthAsset[] {\n const first = listAssets(project, { page: 1, pageSize: 100, source });\n const assets = [...first.assets];\n for (let page = 2; page <= first.pagination.totalPages; page += 1) {\n assets.push(...listAssets(project, { page, pageSize: 100, source }).assets);\n }\n return assets;\n}\n\nfunction isPosted(asset: GrowthAsset): boolean {\n return Boolean(asset.placements?.some(placement => placement.status === 'posted'));\n}\n\nfunction isScheduled(asset: GrowthAsset): boolean {\n return Boolean(asset.placements?.some(placement => placement.status === 'scheduled'));\n}\n\nfunction isReadyToPost(asset: GrowthAsset): boolean {\n return asset.status !== 'archived' && Boolean(asset.s3?.key) && !isPosted(asset) && !isScheduled(asset);\n}\n\nfunction withReviews(project: string, assets: GrowthAsset[]): ReviewableAsset[] {\n const reviewMap = getAssetReviewMap(project, assets.map(asset => asset.asset_id));\n return assets.map(asset => ({\n ...asset,\n review: reviewMap[asset.asset_id]\n ? {\n notes: reviewMap[asset.asset_id].notes,\n review_state: reviewMap[asset.asset_id].review_state,\n updated_at: reviewMap[asset.asset_id].updated_at,\n }\n : { review_state: 'unreviewed' },\n }));\n}\n\nfunction reviewState(asset: ReviewableAsset) {\n return asset.review?.review_state || 'unreviewed';\n}\n\nfunction laneFor(channel: string, localAssets: ReviewableAsset[], catalogAssets: GrowthAsset[], limit: number): ReviewQueueLane {\n const reviewedLocal = localAssets.filter(asset => asset.channel === channel);\n const needsQa = reviewedLocal.filter(asset => reviewState(asset) === 'unreviewed');\n const approvedLocal = reviewedLocal.filter(asset => reviewState(asset) === 'approved');\n const needsRevision = reviewedLocal.filter(asset => reviewState(asset) === 'needs_revision');\n const rejectedLocal = reviewedLocal.filter(asset => reviewState(asset) === 'rejected' || reviewState(asset) === 'ignored');\n const readyToPost = catalogAssets.filter(asset => asset.channel === channel && isReadyToPost(asset));\n const scheduled = catalogAssets.filter(asset => asset.channel === channel && isScheduled(asset) && !isPosted(asset));\n const posted = catalogAssets.filter(asset => asset.channel === channel && isPosted(asset));\n return {\n approvedLocal: approvedLocal.slice(0, limit),\n channel,\n needsQa: needsQa.slice(0, limit),\n needsRevision: needsRevision.slice(0, limit),\n posted: posted.slice(0, limit),\n readyToPost: readyToPost.slice(0, limit),\n rejectedLocal: rejectedLocal.slice(0, limit),\n scheduled: scheduled.slice(0, limit),\n totals: {\n approvedLocal: approvedLocal.length,\n needsQa: needsQa.length,\n needsRevision: needsRevision.length,\n posted: posted.length,\n readyToPost: readyToPost.length,\n rejectedLocal: rejectedLocal.length,\n scheduled: scheduled.length,\n },\n };\n}\n\nfunction handoff(project: string) {\n const prefix = `npx @mean-weasel/lineage`;\n return {\n backupTemplate: `${prefix} local backup --project ${project} --asset-id <local-id> --dry-run --json`,\n lineageNextTemplate: `${prefix} lineage next --project ${project} --root <root-id> --json`,\n localListCommand: `${prefix} local list --project ${project} --json`,\n queueCommand: `${prefix} review queue --project ${project} --json`,\n scheduleTemplate: `${prefix} placement mark-scheduled --project ${project} --asset-id <asset-id> --channel <channel> --scheduled-at <iso> --dry-run --json`,\n };\n}\n\nexport function getReviewQueue(project = defaultProject, options: QueueOptions = {}): ReviewQueueSnapshot {\n const limit = Math.min(Math.max(Number(options.limit || 6), 1), 24);\n const localAssets = allAssets(project, 'local');\n const catalogAssets = allAssets(project, 'catalog');\n const channels = Array.from(new Set([...localAssets, ...catalogAssets].map(asset => asset.channel)))\n .filter(channel => !options.channel || options.channel === 'all' || channel === options.channel)\n .sort();\n const channelSet = new Set(channels);\n const reviewedLocalAssets = withReviews(project, localAssets.filter(asset => channelSet.has(asset.channel)));\n const lanes = channels.map(channel => laneFor(channel, reviewedLocalAssets, catalogAssets, limit));\n return {\n fetchedAt: new Date().toISOString(),\n handoff: handoff(project),\n lanes,\n project,\n totals: {\n approvedLocal: lanes.reduce((sum, lane) => sum + lane.totals.approvedLocal, 0),\n channels: lanes.length,\n needsQa: lanes.reduce((sum, lane) => sum + lane.totals.needsQa, 0),\n needsRevision: lanes.reduce((sum, lane) => sum + lane.totals.needsRevision, 0),\n posted: lanes.reduce((sum, lane) => sum + lane.totals.posted, 0),\n readyToPost: lanes.reduce((sum, lane) => sum + lane.totals.readyToPost, 0),\n rejectedLocal: lanes.reduce((sum, lane) => sum + lane.totals.rejectedLocal, 0),\n scheduled: lanes.reduce((sum, lane) => sum + lane.totals.scheduled, 0),\n },\n };\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport type { AssetSelectionActor, AssetSelectionItem, AssetSelectionItemRole, AssetSelectionSet } from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nexport class AssetReviewSetError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetReviewSetError(error: unknown): error is AssetReviewSetError {\n return error instanceof AssetReviewSetError;\n}\n\nfunction rowToItem(row: Row): AssetSelectionItem {\n return {\n id: String(row.id),\n set_id: String(row.set_id),\n asset_id: String(row.asset_id),\n role: String(row.role) as AssetSelectionItemRole,\n variation_label: typeof row.variation_label === 'string' ? row.variation_label : undefined,\n position: Number(row.position || 0),\n selected_by: typeof row.selected_by === 'string' ? row.selected_by as AssetSelectionActor : undefined,\n selected_at: typeof row.selected_at === 'string' ? row.selected_at : undefined,\n deselected_at: typeof row.deselected_at === 'string' ? row.deselected_at : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction itemsForSet(database: DatabaseSync, id: string): AssetSelectionItem[] {\n return (database.prepare(`\n select * from selection_items where set_id = ?\n order by position, variation_label, created_at, asset_id\n `).all(id) as Row[]).map(rowToItem);\n}\n\nfunction rowToSet(database: DatabaseSync, row: Row): AssetSelectionSet {\n const id = String(row.id);\n return {\n id,\n project: String(row.project_id),\n kind: 'review',\n key: String(row.key),\n label: String(row.label),\n status: row.status === 'archived' ? 'archived' : 'active',\n created_by: String(row.created_by) as AssetSelectionActor,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n items: itemsForSet(database, id),\n };\n}\n\nfunction reviewSet(database: DatabaseSync, project: string, setId: string): AssetSelectionSet {\n const row = database.prepare(`\n select * from selection_sets where id = ? and project_id = ? and kind = 'review'\n `).get(setId, project) as Row | undefined;\n if (!row) throw new AssetReviewSetError(`Unknown review set: ${setId}`, 404);\n return rowToSet(database, row);\n}\n\nexport function inspectReviewSet(project: string, setId: string): AssetSelectionSet {\n const database = lineageDb();\n try {\n return reviewSet(database, project, setId);\n } finally {\n database.close();\n }\n}\n\nexport function listReviewSets(project: string): AssetSelectionSet[] {\n const database = lineageDb();\n try {\n return (database.prepare(`\n select * from selection_sets where project_id = ? and kind = 'review'\n order by updated_at desc, created_at desc\n `).all(project) as Row[]).map(row => rowToSet(database, row));\n } finally {\n database.close();\n }\n}\n\nexport function archiveReviewSet(project: string, setId: string, confirmWrite: boolean) {\n const preview = { project, review_set: setId, status: 'archived' };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would archive review set ${setId}`, preview };\n const database = lineageDb();\n try {\n reviewSet(database, project, setId);\n database.prepare('update selection_sets set status = ?, updated_at = ? where id = ?').run('archived', nowIso(), setId);\n return { ok: true as const, message: `Archived review set ${setId}`, review_set: reviewSet(database, project, setId) };\n } finally {\n database.close();\n }\n}\n\nexport function activateReviewSet(project: string, setId: string, confirmWrite: boolean) {\n const preview = { project, review_set: setId, status: 'active' };\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would activate review set ${setId}`, preview };\n const database = lineageDb();\n try {\n reviewSet(database, project, setId);\n const timestamp = nowIso();\n database.prepare(`\n update selection_sets set status = 'archived', updated_at = ?\n where project_id = ? and kind = 'review' and status = 'active' and id <> ?\n `).run(timestamp, project, setId);\n database.prepare('update selection_sets set status = ?, updated_at = ? where id = ?').run('active', timestamp, setId);\n return { ok: true as const, message: `Activated review set ${setId}`, review_set: reviewSet(database, project, setId) };\n } finally {\n database.close();\n }\n}\n", "import express from 'express';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { activateReviewSet, archiveReviewSet, inspectReviewSet } from './assetReviewSets';\nimport type {\n AssetSelectionActor,\n AssetSelectionItem,\n AssetSelectionItemRole,\n AssetSelectionSet,\n AssetSelectionSetKind,\n AssetSelectionSnapshot,\n} from '../shared/types';\n\ntype Row = Record<string, unknown>;\n\nconst actors = new Set<AssetSelectionActor>(['human', 'agent', 'system']);\n\nexport class AssetSelectionError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAssetSelectionError(error: unknown): error is AssetSelectionError {\n return error instanceof AssetSelectionError;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction requireText(value: string | undefined, label: string): string {\n const text = value?.trim();\n if (!text) throw new AssetSelectionError(`Selection ${label} is required`);\n return text;\n}\n\nfunction normalizeActor(value: string | undefined, fallback: AssetSelectionActor): AssetSelectionActor {\n const actor = (value || fallback) as AssetSelectionActor;\n if (!actors.has(actor)) throw new AssetSelectionError(`Unsupported selection actor: ${actor}`);\n return actor;\n}\n\nfunction slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 80) || 'review-set';\n}\n\nfunction setId(project: string, kind: AssetSelectionSetKind, key: string): string {\n return `${project}:${kind}:${key}`;\n}\n\nfunction itemId(selectionSetId: string, assetId: string): string {\n return `${selectionSetId}:asset:${assetId}`;\n}\n\nfunction variationLabel(index: number): string {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (index < alphabet.length) return alphabet[index];\n return `A${index - alphabet.length + 1}`;\n}\n\nfunction rowToItem(row: Row): AssetSelectionItem {\n return {\n id: String(row.id),\n set_id: String(row.set_id),\n asset_id: String(row.asset_id),\n role: String(row.role) as AssetSelectionItemRole,\n variation_label: typeof row.variation_label === 'string' ? row.variation_label : undefined,\n position: Number(row.position || 0),\n selected_by: typeof row.selected_by === 'string' ? row.selected_by as AssetSelectionActor : undefined,\n selected_at: typeof row.selected_at === 'string' ? row.selected_at : undefined,\n deselected_at: typeof row.deselected_at === 'string' ? row.deselected_at : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction itemsForSet(database: DatabaseSync, id: string): AssetSelectionItem[] {\n return (database.prepare(`\n select * from selection_items\n where set_id = ?\n order by position, variation_label, created_at, asset_id\n `).all(id) as Row[]).map(rowToItem);\n}\n\nfunction rowToSet(database: DatabaseSync, row: Row): AssetSelectionSet {\n const id = String(row.id);\n return {\n id,\n project: String(row.project_id),\n kind: String(row.kind) as AssetSelectionSetKind,\n key: String(row.key),\n label: String(row.label),\n status: row.status === 'archived' ? 'archived' : 'active',\n created_by: String(row.created_by) as AssetSelectionActor,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n items: itemsForSet(database, id),\n };\n}\n\nfunction getSetById(database: DatabaseSync, id: string): AssetSelectionSet | null {\n const row = database.prepare('select * from selection_sets where id = ?').get(id) as Row | undefined;\n return row ? rowToSet(database, row) : null;\n}\n\nfunction getCurrentSet(database: DatabaseSync, project: string): AssetSelectionSet {\n ensureSelectionSet(database, project, {\n createdBy: 'system',\n key: 'current',\n kind: 'current',\n label: 'Current selections',\n });\n const found = getSetById(database, setId(project, 'current', 'current'));\n if (!found) throw new AssetSelectionError(`Unable to create current selection set for ${project}`, 500);\n return found;\n}\n\nfunction ensureSelectionSet(database: DatabaseSync, project: string, fields: {\n createdBy: AssetSelectionActor;\n key: string;\n kind: AssetSelectionSetKind;\n label: string;\n}): string {\n ensureProject(database, project);\n const timestamp = nowIso();\n const id = setId(project, fields.kind, fields.key);\n database.prepare(`\n insert into selection_sets (id, project_id, kind, key, label, status, created_by, created_at, updated_at)\n values (?, ?, ?, ?, ?, 'active', ?, ?, ?)\n on conflict(project_id, kind, key) do update set\n label = excluded.label, status = 'active', updated_at = excluded.updated_at\n `).run(id, project, fields.kind, fields.key, fields.label, fields.createdBy, timestamp, timestamp);\n return id;\n}\n\nfunction replaceSetItems(database: DatabaseSync, id: string, items: Array<{\n assetId: string;\n notes?: string;\n position: number;\n role: AssetSelectionItemRole;\n selectedAt?: string;\n selectedBy?: AssetSelectionActor;\n variationLabel?: string;\n}>): void {\n database.prepare('delete from selection_items where set_id = ?').run(id);\n const timestamp = nowIso();\n const statement = database.prepare(`\n insert into selection_items (\n id, set_id, asset_id, role, variation_label, position, selected_by,\n selected_at, deselected_at, notes, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, null, ?, ?, ?)\n `);\n for (const item of items) {\n statement.run(\n itemId(id, item.assetId),\n id,\n item.assetId,\n item.role,\n item.variationLabel || null,\n item.position,\n item.selectedBy || null,\n item.selectedAt || null,\n item.notes || null,\n timestamp,\n timestamp,\n );\n }\n}\n\nexport function getAssetSelectionSnapshot(project: string): AssetSelectionSnapshot {\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n const reviewRows = database.prepare(`\n select * from selection_sets\n where project_id = ? and kind = 'review'\n order by updated_at desc, created_at desc\n `).all(project) as Row[];\n const reviewSets = reviewRows.map(row => rowToSet(database, row));\n return {\n project,\n fetchedAt: nowIso(),\n current,\n active_review_set: reviewSets.find(set => set.status === 'active') || null,\n review_sets: reviewSets,\n };\n } finally {\n database.close();\n }\n}\n\nexport function selectCurrentAssets(project: string, fields: {\n assetIds: string[];\n confirmWrite: boolean;\n notes?: string;\n selectedBy?: AssetSelectionActor;\n}) {\n const assetIds = [...new Set(fields.assetIds.map(assetId => assetId.trim()).filter(Boolean))];\n const actor = normalizeActor(fields.selectedBy, 'human');\n const preview = { assetIds, notes: fields.notes, project, selectedBy: actor };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would select ${assetIds.length} assets`, preview };\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n const selectedAt = nowIso();\n replaceSetItems(database, current.id, assetIds.map((assetId, index) => ({\n assetId,\n notes: fields.notes,\n position: index,\n role: 'primary',\n selectedAt,\n selectedBy: actor,\n })));\n database.prepare('update selection_sets set updated_at = ? where id = ?').run(selectedAt, current.id);\n return { ok: true as const, message: `Selected ${assetIds.length} assets`, selection: getSetById(database, current.id) };\n } finally {\n database.close();\n }\n}\n\nexport function clearCurrentSelection(project: string, confirmWrite: boolean) {\n if (!confirmWrite) return { ok: true as const, dryRun: true as const, message: 'Would clear current asset selections' };\n const database = lineageDb();\n try {\n const current = getCurrentSet(database, project);\n database.prepare('delete from selection_items where set_id = ?').run(current.id);\n database.prepare('update selection_sets set updated_at = ? where id = ?').run(nowIso(), current.id);\n return { ok: true as const, message: 'Cleared current asset selections', selection: getSetById(database, current.id) };\n } finally {\n database.close();\n }\n}\n\nexport function createReviewSet(project: string, fields: {\n assetIds?: string[];\n confirmWrite: boolean;\n createdBy?: AssetSelectionActor;\n key?: string;\n label: string;\n notes?: string;\n}) {\n const label = requireText(fields.label, 'review set label');\n const key = fields.key?.trim() || `${slug(label)}-${Date.now().toString(36)}`;\n const assetIds = [...new Set((fields.assetIds || []).map(assetId => assetId.trim()).filter(Boolean))];\n const actor = normalizeActor(fields.createdBy, 'agent');\n const preview = { assetIds, createdBy: actor, key, label, notes: fields.notes, project };\n if (!fields.confirmWrite) return { ok: true as const, dryRun: true as const, message: `Would create review set ${label}`, preview };\n const database = lineageDb();\n try {\n const id = ensureSelectionSet(database, project, { createdBy: actor, key, kind: 'review', label });\n replaceSetItems(database, id, assetIds.map((assetId, index) => ({\n assetId,\n notes: fields.notes,\n position: index,\n role: 'candidate',\n variationLabel: variationLabel(index),\n })));\n return { ok: true as const, message: `Saved review set ${label}`, review_set: getSetById(database, id) };\n } finally {\n database.close();\n }\n}\n\nfunction activeReviewSet(database: DatabaseSync, project: string, setId?: string): AssetSelectionSet {\n if (setId) {\n const found = getSetById(database, setId);\n if (found?.project === project && found.kind === 'review' && found.status === 'active') return found;\n throw new AssetSelectionError(`Unknown active review set: ${setId}`, 404);\n }\n const rows = database.prepare(`\n select * from selection_sets\n where project_id = ? and kind = 'review' and status = 'active'\n order by updated_at desc, created_at desc\n limit 2\n `).all(project) as Row[];\n if (rows.length === 0) throw new AssetSelectionError(`No active review set exists for ${project}`, 404);\n if (rows.length > 1) throw new AssetSelectionError(`Multiple active review sets exist for ${project}; pass --set-id`, 409);\n return rowToSet(database, rows[0]);\n}\n\nexport function chooseReviewSetLabels(project: string, fields: {\n confirmWrite: boolean;\n labels: string[];\n notes?: string;\n selectedBy?: AssetSelectionActor;\n setId?: string;\n}) {\n const labels = [...new Set(fields.labels.map(label => label.trim().toUpperCase()).filter(Boolean))];\n if (labels.length === 0) throw new AssetSelectionError('At least one variation label is required');\n const actor = normalizeActor(fields.selectedBy, 'human');\n const database = lineageDb();\n try {\n const reviewSet = activeReviewSet(database, project, fields.setId);\n const byLabel = new Map(reviewSet.items.filter(item => item.variation_label).map(item => [item.variation_label, item]));\n const missing = labels.filter(label => !byLabel.has(label));\n if (missing.length > 0) throw new AssetSelectionError(`Unknown variation labels for ${reviewSet.label}: ${missing.join(', ')}`, 404);\n const chosen = labels.map(label => byLabel.get(label)!);\n const selectedAt = nowIso();\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n message: `Would choose ${labels.join(', ')} from ${reviewSet.label}`,\n preview: { labels, project, review_set: reviewSet.id, selected_assets: chosen.map(item => item.asset_id), selectedBy: actor },\n };\n }\n database.prepare('update selection_items set selected_by = null, selected_at = null, deselected_at = ?, updated_at = ? where set_id = ?')\n .run(selectedAt, selectedAt, reviewSet.id);\n const choose = database.prepare(`\n update selection_items\n set selected_by = ?, selected_at = ?, deselected_at = null, notes = ?, updated_at = ?\n where set_id = ? and variation_label = ?\n `);\n for (const label of labels) choose.run(actor, selectedAt, fields.notes || null, selectedAt, reviewSet.id, label);\n const current = getCurrentSet(database, project);\n replaceSetItems(database, current.id, chosen.map((item, index) => ({\n assetId: item.asset_id,\n notes: fields.notes || item.notes,\n position: index,\n role: 'primary',\n selectedAt,\n selectedBy: actor,\n variationLabel: item.variation_label,\n })));\n database.prepare('update selection_sets set updated_at = ? where id in (?, ?)').run(selectedAt, reviewSet.id, current.id);\n return {\n ok: true as const,\n message: `Selected ${labels.join(', ')} from ${reviewSet.label}`,\n current: getSetById(database, current.id),\n review_set: getSetById(database, reviewSet.id),\n };\n } finally {\n database.close();\n }\n}\n\nexport function labelsFromPrompt(prompt: string): string[] {\n const normalized = prompt.toUpperCase();\n const explicit = [...normalized.matchAll(/\\bVARIATION\\s+([A-Z])\\b/g)].map(match => match[1]);\n const short = [...normalized.matchAll(/\\b([A-Z])\\b/g)]\n .map(match => match[1])\n .filter(label => !['A', 'I'].includes(label));\n return [...new Set([...explicit, ...short])];\n}\n\nexport function assetSelectionRouter(projectFrom: (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string) {\n const router = express.Router();\n const asyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void): express.RequestHandler =>\n (req, res, next) => { Promise.resolve(handler(req, res)).catch(next); };\n router.get('/', asyncRoute((req, res) => {\n res.json(getAssetSelectionSnapshot(projectFrom(req)));\n }));\n router.post('/current', asyncRoute((req, res) => {\n const ids = Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [String(req.body.assetId || '')];\n res.json(selectCurrentAssets(projectFrom(req), {\n assetIds: ids,\n confirmWrite: req.body.confirmWrite === true,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n selectedBy: req.body.selectedBy === 'agent' || req.body.selectedBy === 'system' ? req.body.selectedBy : 'human',\n }));\n }));\n router.post('/current/clear', asyncRoute((req, res) => {\n res.json(clearCurrentSelection(projectFrom(req), req.body.confirmWrite === true));\n }));\n router.post('/review-sets', asyncRoute((req, res) => {\n res.json(createReviewSet(projectFrom(req), {\n assetIds: Array.isArray(req.body.assetIds) ? req.body.assetIds.map(String) : [],\n confirmWrite: req.body.confirmWrite === true,\n createdBy: req.body.createdBy === 'human' || req.body.createdBy === 'system' ? req.body.createdBy : 'agent',\n key: typeof req.body.key === 'string' ? req.body.key : undefined,\n label: String(req.body.label || 'Agent review set'),\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n }));\n }));\n router.get('/review-sets/:setId', asyncRoute((req, res) => { res.json({ ok: true, project: projectFrom(req), review_set: inspectReviewSet(projectFrom(req), req.params.setId) }); }));\n router.post('/review-sets/archive', asyncRoute((req, res) => { res.json(archiveReviewSet(projectFrom(req), String(req.body.setId || ''), req.body.confirmWrite === true)); }));\n router.post('/review-sets/activate', asyncRoute((req, res) => { res.json(activateReviewSet(projectFrom(req), String(req.body.setId || ''), req.body.confirmWrite === true)); }));\n router.post('/review-sets/choose', asyncRoute((req, res) => {\n const labels = Array.isArray(req.body.labels) ? req.body.labels.map(String) : String(req.body.labels || '').split(',');\n res.json(chooseReviewSetLabels(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n labels,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n selectedBy: req.body.selectedBy === 'agent' || req.body.selectedBy === 'system' ? req.body.selectedBy : 'human',\n setId: typeof req.body.setId === 'string' ? req.body.setId : undefined,\n }));\n }));\n return router;\n}\n", "import type express from 'express';\nimport {\n AgentClaimError,\n createAgentClaim,\n heartbeatAgentClaim,\n inspectAgentClaim,\n listAgentClaims,\n parseClaimTtl,\n releaseAgentClaim,\n releaseStaleAgentClaim,\n revokeAgentClaim,\n transferAgentClaim,\n type AgentClaimScopeType,\n} from './agentClaims';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function claimTokenFromRequest(req: express.Request): string | undefined {\n const header = req.header('X-Lineage-Claim-Token');\n if (header) return header;\n return typeof req.body?.claimToken === 'string' ? req.body.claimToken : undefined;\n}\n\nfunction stringBody(req: express.Request, key: string): string | undefined {\n const value = (req.body as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction boolBody(req: express.Request, key: string): boolean {\n return (req.body as Record<string, unknown>)[key] === true;\n}\n\nexport function registerAgentClaimRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/agent-claims', asyncRoute((req, res) => {\n const project = typeof req.query.project === 'string' ? req.query.project : undefined;\n res.json(listAgentClaims(project));\n }));\n\n app.post('/api/agent-claims', asyncRoute((req, res) => {\n res.json(createAgentClaim({\n agentId: stringBody(req, 'agentId'),\n agentKind: stringBody(req, 'agentKind'),\n agentName: stringBody(req, 'agentName') || stringBody(req, 'agent_name') || '',\n channel: stringBody(req, 'channel'),\n force: boolBody(req, 'force'),\n metadata: typeof req.body.metadata === 'object' && req.body.metadata !== null ? req.body.metadata as Record<string, unknown> : undefined,\n project: projectFrom({ body: req.body as Record<string, unknown>, query: req.query }),\n reason: stringBody(req, 'reason'),\n scopeType: (stringBody(req, 'scopeType') || stringBody(req, 'scope_type') || '') as AgentClaimScopeType,\n targetId: stringBody(req, 'targetId') || stringBody(req, 'target_id') || '',\n targetTitle: stringBody(req, 'targetTitle') || stringBody(req, 'target_title'),\n threadId: stringBody(req, 'threadId') || stringBody(req, 'thread_id'),\n ttlSeconds: parseClaimTtl(stringBody(req, 'ttl')),\n }));\n }));\n\n app.get('/api/agent-claims/:claimId', asyncRoute((req, res) => {\n res.json(inspectAgentClaim(req.params.claimId, typeof req.query.project === 'string' ? req.query.project : undefined));\n }));\n\n app.post('/api/agent-claims/:claimId/heartbeat', asyncRoute((req, res) => {\n const claimToken = claimTokenFromRequest(req);\n if (!claimToken) throw new AgentClaimError('Heartbeat requires claimToken', 400, 'claim_token_required');\n res.json(heartbeatAgentClaim(claimToken, parseClaimTtl(stringBody(req, 'ttl'))));\n }));\n\n app.post('/api/agent-claims/:claimId/release', asyncRoute((req, res) => {\n const claimToken = claimTokenFromRequest(req);\n if (!claimToken) throw new AgentClaimError('Release requires claimToken', 400, 'claim_token_required');\n res.json(releaseAgentClaim(claimToken));\n }));\n\n app.post('/api/agent-claims/:claimId/release-stale', asyncRoute((req, res) => {\n res.json(releaseStaleAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n }));\n }));\n\n app.post('/api/agent-claims/:claimId/revoke', asyncRoute((req, res) => {\n res.json(revokeAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n }));\n }));\n\n app.post('/api/agent-claims/:claimId/transfer', asyncRoute((req, res) => {\n res.json(transferAgentClaim(projectFrom({ body: req.body as Record<string, unknown>, query: req.query }), req.params.claimId, {\n actor: stringBody(req, 'actor') || 'human',\n confirmWrite: boolBody(req, 'confirmWrite'),\n reason: stringBody(req, 'reason'),\n toAgentName: stringBody(req, 'toAgentName') || stringBody(req, 'to_agent_name') || '',\n }));\n }));\n}\n", "import { defaultProject, listProjects } from '../assetCore';\nimport { lineageDb, nowIso, type DatabaseSync } from '../assetLineageDb';\nimport type { AdapterProvider, AdapterSetting, AdapterSettingsSnapshot, AdapterType } from '../../shared/adapterSettingsTypes';\n\ninterface AdapterDefinition {\n adapter_type: AdapterType;\n default_enabled: boolean;\n description: string;\n label: string;\n provider: AdapterProvider;\n safeConfig(project: string): Record<string, unknown>;\n secret_ref: string | null;\n}\n\ninterface AdapterSettingRow {\n adapter_type: AdapterType;\n enabled: number;\n provider: AdapterProvider;\n safe_config_json: string;\n secret_ref: string | null;\n updated_at: string;\n}\n\nexport interface UpdateAdapterSettingFields {\n adapterType: AdapterType;\n confirmWrite: boolean;\n enabled: boolean;\n provider: AdapterProvider;\n safeConfig?: Record<string, unknown>;\n}\n\nexport class AdapterSettingsError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isAdapterSettingsError(error: unknown): error is AdapterSettingsError {\n return error instanceof AdapterSettingsError;\n}\n\nconst definitions: AdapterDefinition[] = [\n {\n adapter_type: 'cloud',\n default_enabled: false,\n description: 'Optional cloud storage inspection for projects that configure it explicitly.',\n label: 'Cloud storage',\n provider: 's3',\n safeConfig: project => {\n if (project === defaultProject) return { bucket: '', mode: 'local-public-fallback', region: '' };\n const summary = listProjects().find(item => item.project === project);\n return { bucket: summary?.default_bucket || '', region: summary?.default_region || '' };\n },\n secret_ref: null,\n },\n {\n adapter_type: 'scheduler',\n default_enabled: false,\n description: 'Prepare reviewed social posts for external scheduling.',\n label: 'Buffer',\n provider: 'buffer',\n safeConfig: () => ({ defaultMode: 'dry-run' }),\n secret_ref: 'env:LINEAGE_SCHEDULER_TOKEN',\n },\n {\n adapter_type: 'image_generator',\n default_enabled: true,\n description: 'Create generation handoff packets and store proof receipts.',\n label: 'Codex handoff',\n provider: 'codex-handoff',\n safeConfig: () => ({ clearSelectionAfterImport: true, defaultVariationCount: 3, receipts: 'sqlite' }),\n secret_ref: null,\n },\n];\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction definitionFor(adapterType: AdapterType, provider: AdapterProvider): AdapterDefinition {\n const definition = definitions.find(item => item.adapter_type === adapterType && item.provider === provider);\n if (!definition) throw new AdapterSettingsError(`Unsupported adapter setting: ${adapterType}/${provider}`, 404);\n return definition;\n}\n\nfunction seedDefaults(database: DatabaseSync, project: string): void {\n ensureProject(database, project);\n const timestamp = nowIso();\n for (const definition of definitions) {\n database.prepare(`\n insert into adapter_settings (\n project_id, adapter_type, provider, enabled, secret_ref, safe_config_json, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, adapter_type, provider) do nothing\n `).run(\n project,\n definition.adapter_type,\n definition.provider,\n definition.default_enabled ? 1 : 0,\n definition.secret_ref,\n JSON.stringify(definition.safeConfig(project)),\n timestamp,\n timestamp\n );\n }\n}\n\nfunction parseConfig(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : {};\n } catch {\n return {};\n }\n}\n\nfunction credentialFor(provider: AdapterProvider, env: NodeJS.ProcessEnv) {\n if (provider === 's3') {\n return { detected: false, label: 'Optional local cloud CLI credential', secret_ref: null };\n }\n if (provider === 'buffer') {\n const detected = Boolean(env.LINEAGE_SCHEDULER_TOKEN && env.LINEAGE_SCHEDULER_ORGANIZATION_ID);\n return { detected, label: 'LINEAGE_SCHEDULER_TOKEN + LINEAGE_SCHEDULER_ORGANIZATION_ID', secret_ref: 'env:LINEAGE_SCHEDULER_TOKEN' };\n }\n return { detected: true, label: 'No external secret required', secret_ref: null };\n}\n\nfunction healthStatus(provider: AdapterProvider, enabled: boolean, config: Record<string, unknown>, credential: ReturnType<typeof credentialFor>) {\n if (provider === 's3') {\n if (!enabled) return 'live_disabled';\n return config.bucket && config.region ? 'not_tested' : 'missing_config';\n }\n if (provider === 'buffer') {\n if (!enabled) return 'live_disabled';\n return credential.detected ? 'configured' : 'dry_run_available';\n }\n if (!enabled) return 'disabled';\n return credential.detected ? 'configured' : 'missing_config';\n}\n\nfunction settingFromRow(row: AdapterSettingRow, env: NodeJS.ProcessEnv): AdapterSetting {\n const definition = definitionFor(row.adapter_type, row.provider);\n const credential = credentialFor(row.provider, env);\n const enabled = row.enabled === 1;\n const safeConfig = parseConfig(row.safe_config_json);\n return {\n adapter_type: row.adapter_type,\n credential,\n description: definition.description,\n enabled,\n health_status: healthStatus(row.provider, enabled, safeConfig, credential),\n label: definition.label,\n provider: row.provider,\n safe_config: safeConfig,\n updated_at: row.updated_at,\n };\n}\n\nfunction rejectSecretLikeConfig(config: Record<string, unknown>): void {\n const blocked = ['secret', 'token', 'password', 'credential', 'api_key', 'apikey'];\n const visit = (value: unknown, path: string[]): void => {\n if (!value || typeof value !== 'object') return;\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (blocked.some(term => normalized.includes(term.replace(/[^a-z0-9]/g, '')))) {\n throw new AdapterSettingsError(`Adapter settings cannot store secret-like keys: ${[...path, key].join('.')}`);\n }\n visit(child, [...path, key]);\n }\n };\n visit(config, []);\n}\n\nexport function getAdapterSettings(project = defaultProject, env: NodeJS.ProcessEnv = process.env): AdapterSettingsSnapshot {\n const database = lineageDb();\n try {\n seedDefaults(database, project);\n const rows = database.prepare(`\n select adapter_type, provider, enabled, secret_ref, safe_config_json, updated_at\n from adapter_settings\n where project_id = ?\n order by case adapter_type when 'cloud' then 0 when 'scheduler' then 1 else 2 end\n `).all(project) as unknown as AdapterSettingRow[];\n return { fetchedAt: nowIso(), project, settings: rows.map(row => settingFromRow(row, env)) };\n } finally {\n database.close();\n }\n}\n\nexport function updateAdapterSetting(project = defaultProject, fields: UpdateAdapterSettingFields, env: NodeJS.ProcessEnv = process.env): AdapterSetting {\n if (!fields.confirmWrite) throw new AdapterSettingsError('Adapter settings update requires confirmWrite=true');\n const definition = definitionFor(fields.adapterType, fields.provider);\n const database = lineageDb();\n try {\n seedDefaults(database, project);\n const current = database.prepare(`\n select safe_config_json from adapter_settings\n where project_id = ? and adapter_type = ? and provider = ?\n `).get(project, fields.adapterType, fields.provider) as { safe_config_json: string } | undefined;\n const safeConfig = fields.safeConfig || parseConfig(current?.safe_config_json || '{}') || definition.safeConfig(project);\n rejectSecretLikeConfig(safeConfig);\n const timestamp = nowIso();\n database.prepare(`\n update adapter_settings\n set enabled = ?, safe_config_json = ?, secret_ref = ?, updated_at = ?\n where project_id = ? and adapter_type = ? and provider = ?\n `).run(fields.enabled ? 1 : 0, JSON.stringify(safeConfig), definition.secret_ref, timestamp, project, fields.adapterType, fields.provider);\n const row = database.prepare(`\n select adapter_type, provider, enabled, secret_ref, safe_config_json, updated_at\n from adapter_settings\n where project_id = ? and adapter_type = ? and provider = ?\n `).get(project, fields.adapterType, fields.provider) as unknown as AdapterSettingRow;\n return settingFromRow(row, env);\n } finally {\n database.close();\n }\n}\n", "import type { PostingAdapter, PostingAdapterStatus, PostingCommandResult, PostingDryRunRequest, PostingDryRunResult } from './types';\n\ninterface BufferPostingAdapterDependencies {\n env?: NodeJS.ProcessEnv;\n runBuffer(args: string[]): PostingCommandResult;\n writePayload(payload: Record<string, unknown>): string;\n}\n\nfunction missingConfig(env: NodeJS.ProcessEnv): string[] {\n return ['LINEAGE_SCHEDULER_TOKEN', 'LINEAGE_SCHEDULER_ORGANIZATION_ID'].filter(key => !env[key]);\n}\n\nfunction textForPost(request: PostingDryRunRequest): string {\n const body = request.post.body?.trim() || request.post.title.trim();\n const cta = request.post.cta?.trim();\n const parts = [body, cta].filter(Boolean);\n const text = parts.join('\\n\\n').trim();\n if (!text) throw new Error('Buffer post text is required');\n return text;\n}\n\nexport function buildBufferPostPayload(request: PostingDryRunRequest): Record<string, unknown> {\n const channelId = request.target.channelId.trim();\n if (!channelId) throw new Error('Buffer channelId is required');\n const scheduledAt = request.post.scheduled_at?.trim();\n const payload: Record<string, unknown> = {\n channelId,\n mode: scheduledAt ? 'schedule' : 'addToQueue',\n schedulingType: scheduledAt ? 'scheduled' : 'automatic',\n text: textForPost(request),\n };\n if (scheduledAt) payload.scheduledAt = scheduledAt;\n const media = (request.assets || [])\n .filter(asset => asset.url.trim())\n .map(asset => ({\n altText: asset.altText || asset.assetId,\n url: asset.url,\n }));\n if (media.length > 0) payload.media = media;\n return payload;\n}\n\nexport function createBufferPostingAdapter(deps: BufferPostingAdapterDependencies): PostingAdapter {\n return {\n dryRunPost(request: PostingDryRunRequest): PostingDryRunResult {\n const payload = buildBufferPostPayload(request);\n const inputPath = deps.writePayload(payload);\n const command = ['posts', 'create', '--input', inputPath, '--dry-run', '--output', 'json'];\n const result = deps.runBuffer(command);\n return {\n command,\n output: result.stdout.trim() ? JSON.parse(result.stdout) as unknown : null,\n payload,\n provider: 'buffer',\n };\n },\n\n postLive(): never {\n throw new Error('Live Buffer posting is disabled for this adapter tranche. Use dryRunPost and record reviewed scheduling/posted state in SQLite.');\n },\n\n status(): PostingAdapterStatus {\n const missing = missingConfig(deps.env || process.env);\n return {\n can_dry_run: true,\n can_post: false,\n configured: missing.length === 0,\n missing,\n mode: 'dry-run-only',\n provider: 'buffer',\n };\n },\n };\n}\n", "import { defaultProject, listProjects, validateProject } from '../assetCore';\nimport { createBufferPostingAdapter } from './posting/bufferPostingAdapter';\n\nexport function getAdapterStatus(project: string, env: NodeJS.ProcessEnv = process.env) {\n const summary = listProjects().find(item => item.project === project) || (project === defaultProject ? validateProject(project) : undefined);\n const buffer = createBufferPostingAdapter({\n env,\n runBuffer: () => ({ stdout: '{}', stderr: '' }),\n writePayload: () => '.asset-scratch/buffer-dry-run.json',\n });\n return {\n project,\n fetchedAt: new Date().toISOString(),\n storage: project === defaultProject\n ? [{\n provider: 'local',\n configured: true,\n can_list: true,\n can_upload: false,\n mode: 'public-fallback-catalog',\n default_bucket: null,\n default_region: null,\n }]\n : [{\n provider: 's3',\n configured: Boolean(summary?.default_bucket && summary?.default_region),\n can_list: Boolean(summary?.default_bucket && summary?.default_region),\n can_upload: Boolean(summary?.default_bucket && summary?.default_region),\n mode: 'catalog-backed',\n default_bucket: summary?.default_bucket || null,\n default_region: summary?.default_region || null,\n }],\n posting: [buffer.status()],\n };\n}\n", "import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { listContentPosts } from '../../contentBatches';\nimport { getContentTarget } from '../../contentTargets';\nimport { repoRoot } from '../../assetCore';\nimport { buildBufferPostPayload, createBufferPostingAdapter } from './bufferPostingAdapter';\nimport type { ContentPost } from '../../../shared/types';\nimport type { PostingCommandResult } from './types';\n\nexport class PostingAdapterError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isPostingAdapterError(error: unknown): error is PostingAdapterError {\n return error instanceof PostingAdapterError;\n}\n\nexport interface BufferDryRunFields {\n bufferChannelId: string;\n execute?: boolean;\n postId?: string;\n target?: 'selected';\n}\n\nfunction safeSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'buffer-post';\n}\n\nfunction resolvePost(project: string, fields: BufferDryRunFields): { post: ContentPost; source: 'post' | 'selected_target' } {\n if (fields.postId) {\n const post = listContentPosts(project).posts.find(item => item.id === fields.postId);\n if (!post) throw new PostingAdapterError(`Unknown content post: ${fields.postId}`, 404);\n return { post, source: 'post' };\n }\n if (fields.target === 'selected') {\n const target = getContentTarget(project);\n if (!target.target) throw new PostingAdapterError(`No selected content target exists for ${project}`, 404);\n return { post: target.target.post, source: 'selected_target' };\n }\n throw new PostingAdapterError('Buffer dry run requires postId or target=selected');\n}\n\nfunction payloadPath(project: string, postId: string): string {\n return join(repoRoot, '.asset-scratch', 'buffer-dry-runs', safeSegment(project), `${safeSegment(postId)}.json`);\n}\n\nfunction writePayload(project: string, postId: string, payload: Record<string, unknown>): string {\n const file = payloadPath(project, postId);\n mkdirSync(join(file, '..'), { recursive: true });\n writeFileSync(file, `${JSON.stringify(payload, null, 2)}\\n`);\n return file;\n}\n\nfunction dryRunCommand(inputPath: string): string[] {\n return ['posts', 'create', '--input', inputPath, '--dry-run', '--output', 'json'];\n}\n\nfunction runner(): (args: string[]) => PostingCommandResult {\n return () => ({ stdout: JSON.stringify({ ok: true, dryRun: true }), stderr: '' });\n}\n\nexport function dryRunBufferContentPost(project: string, fields: BufferDryRunFields, env: NodeJS.ProcessEnv = process.env) {\n if (!fields.bufferChannelId.trim()) throw new PostingAdapterError('Buffer dry run requires bufferChannelId');\n const { post, source } = resolvePost(project, fields);\n const request = {\n post,\n target: {\n channelId: fields.bufferChannelId,\n label: post.channel,\n },\n };\n const payload = buildBufferPostPayload(request);\n const inputPath = writePayload(project, post.id, payload);\n const attachedAssets = post.assets.map(asset => ({\n asset_id: asset.asset_id,\n role: asset.role,\n publishable_url: null,\n reason: 'No public media URL is attached to the content post yet.',\n }));\n const adapter = createBufferPostingAdapter({\n env,\n runBuffer: runner(),\n writePayload: () => inputPath,\n });\n const status = adapter.status();\n const result = fields.execute ? adapter.dryRunPost(request) : {\n command: dryRunCommand(inputPath),\n output: null,\n payload,\n provider: 'buffer',\n };\n return {\n ok: true as const,\n project,\n provider: 'buffer',\n mode: 'dry-run-only' as const,\n executed: fields.execute === true,\n can_post: false,\n configured: status.configured,\n missing: status.missing,\n source,\n post: {\n id: post.id,\n batch_id: post.batch_id,\n channel: post.channel,\n phase: post.phase,\n scheduled_at: post.scheduled_at,\n title: post.title,\n },\n target: {\n buffer_channel_id: fields.bufferChannelId,\n label: post.channel,\n },\n command: result.command,\n payload_path: inputPath,\n payload: result.payload,\n output: result.output,\n attached_assets: attachedAssets,\n warnings: [\n 'Live Buffer posting is disabled for this adapter tranche.',\n ...(attachedAssets.length > 0 ? ['Attached assets are not included as Buffer media until they have public publishable URLs.'] : []),\n ],\n fetchedAt: new Date().toISOString(),\n };\n}\n", "import type { ContentPost, ContentPostReadiness, ContentTargetHandoff } from '../shared/types';\n\nexport function readinessForPost(post: ContentPost): ContentPostReadiness {\n if (post.phase === 'skipped' || post.phase === 'archived') return 'skipped_or_archived';\n if (post.phase === 'posted') return 'posted';\n if (post.phase === 'scheduled') return 'scheduled';\n if (post.phase === 'review') return 'in_review';\n return post.assets.length === 0 ? 'needs_asset' : 'draft_ready';\n}\n\nexport function contentPostHandoff(project: string, post?: ContentPost): ContentTargetHandoff {\n const prefix = 'npx lineage content';\n const postId = post?.id || '<post-id>';\n const batchId = post?.batch_id;\n return {\n agentPrompt: post\n ? `Continue content iterations for ${post.title} (${post.id}) on ${post.channel}. Inspect the target, generate or choose assets, attach approved candidates, then move the post through review before scheduling.`\n : 'Inspect or set a content target before generating content or asset variations.',\n attachAssetTemplate: `${prefix} post attach-asset --project ${project} --post-id ${postId} --asset-id <asset-id> --role primary --confirm-write --json`,\n clearTargetCommand: `${prefix} target clear --project ${project} --confirm-write --json`,\n ...(batchId ? { inspectBatchCommand: `${prefix} batch inspect --project ${project} --batch-id ${batchId} --json` } : {}),\n inspectTargetCommand: `${prefix} target inspect --project ${project} --json`,\n markPostedTemplate: `${prefix} post phase --project ${project} --post-id ${postId} --phase posted --posted-at <iso> --url <url> --confirm-write --json`,\n moveToReviewCommand: `${prefix} post phase --project ${project} --post-id ${postId} --phase review --confirm-write --json`,\n scheduleTemplate: `${prefix} post phase --project ${project} --post-id ${postId} --phase scheduled --scheduled-at <iso> --confirm-write --json`,\n setTargetTemplate: `${prefix} target set --project ${project} --post-id ${postId} --notes <notes> --confirm-write --json`,\n };\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { AgentClaimError, listAgentClaims, validateAgentClaimForWrite } from './agentClaims';\nimport { contentPostHandoff, readinessForPost } from './contentPostHandoff';\nimport type {\n ContentBatch,\n ContentBatchDetail,\n ContentBatchFields,\n ContentBatchSnapshot,\n ContentBatchSummary,\n ContentPost,\n ContentPostAsset,\n ContentPostAssetFields,\n ContentPostFields,\n ContentPostPhase,\n ContentPostUpdateFields,\n} from '../shared/types';\n\nconst phases = new Set<ContentPostPhase>(['draft', 'review', 'scheduled', 'posted', 'skipped', 'archived']);\n\nexport class ContentBatchError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isContentBatchError(error: unknown): error is ContentBatchError {\n return error instanceof ContentBatchError;\n}\n\nfunction ensureProject(database: DatabaseSync, project: string): void {\n const timestamp = nowIso();\n database.prepare(`\n insert into projects (id, product, created_at, updated_at)\n values (?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, timestamp, timestamp);\n}\n\nfunction requireText(value: string | undefined, label: string): string {\n const text = value?.trim();\n if (!text) throw new ContentBatchError(`Content ${label} is required`);\n return text;\n}\n\nfunction normalizePhase(value: string | undefined): ContentPostPhase {\n const phase = (value || 'draft').replace(/-/g, '_') as ContentPostPhase;\n if (!phases.has(phase)) throw new ContentBatchError(`Unsupported content post phase: ${phase}`);\n return phase;\n}\n\nfunction batchFromRow(row: Record<string, unknown>): ContentBatch {\n return {\n id: String(row.id),\n project: String(row.project_id),\n title: String(row.title),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n status: row.status === 'archived' ? 'archived' : 'active',\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction assetFromRow(row: Record<string, unknown>): ContentPostAsset {\n return {\n asset_id: String(row.asset_id),\n role: String(row.role),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n attached_at: String(row.attached_at),\n };\n}\n\nfunction postFromRow(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n const post = basePost(row, assets);\n return { ...post, handoff: contentPostHandoff(post.project, post), readiness: readinessForPost(post) };\n}\n\nfunction basePost(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n return {\n id: String(row.id),\n project: String(row.project_id),\n batch_id: String(row.batch_id),\n channel: String(row.channel),\n title: String(row.title),\n phase: normalizePhase(String(row.phase)),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n body: typeof row.body === 'string' ? row.body : undefined,\n cta: typeof row.cta === 'string' ? row.cta : undefined,\n scheduled_at: typeof row.scheduled_at === 'string' ? row.scheduled_at : undefined,\n posted_at: typeof row.posted_at === 'string' ? row.posted_at : undefined,\n url: typeof row.url === 'string' ? row.url : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n source_path: typeof row.source_path === 'string' ? row.source_path : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n assets,\n };\n}\n\nfunction postsForBatch(database: DatabaseSync, project: string, batchId: string): ContentPost[] {\n const rows = database.prepare(`\n select * from content_posts\n where project_id = ? and batch_id = ?\n order by updated_at desc, id\n `).all(project, batchId) as Record<string, unknown>[];\n return rows.map(row => postFromRow(row, assetsForPost(database, project, String(row.id))));\n}\n\nfunction assetsForPost(database: DatabaseSync, project: string, postId: string): ContentPostAsset[] {\n return (database.prepare(`\n select asset_id, role, notes, attached_at\n from content_post_assets\n where project_id = ? and post_id = ?\n order by attached_at desc, asset_id\n `).all(project, postId) as Record<string, unknown>[]).map(assetFromRow);\n}\n\nfunction phaseCounts(posts: ContentPost[]): Record<ContentPostPhase, number> {\n return Object.fromEntries([...phases].map(phase => [phase, posts.filter(post => post.phase === phase).length])) as Record<ContentPostPhase, number>;\n}\n\nfunction handoff(project: string, batchId: string): ContentBatchDetail['handoff'] {\n const prefix = `npx lineage content`;\n return {\n inspectCommand: `${prefix} batch inspect --project ${project} --batch-id ${batchId} --json`,\n createPostTemplate: `${prefix} post create --project ${project} --batch-id ${batchId} --post-id <post-id> --channel <channel> --title <title> --confirm-write --json`,\n attachAssetTemplate: `${prefix} post attach-asset --project ${project} --post-id <post-id> --asset-id <asset-id> --role primary --confirm-write --json`,\n phaseTemplate: `${prefix} post phase --project ${project} --post-id <post-id> --phase scheduled --scheduled-at <iso> --confirm-write --json`,\n };\n}\n\nexport function listContentBatches(project: string): ContentBatchSnapshot {\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select * from content_batches\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as Record<string, unknown>[];\n const batches = rows.map(row => {\n const batch = batchFromRow(row);\n const posts = postsForBatch(database, project, batch.id);\n return { ...batch, post_count: posts.length, phase_counts: phaseCounts(posts) } satisfies ContentBatchSummary;\n });\n return { project, fetchedAt: nowIso(), batches };\n } finally {\n database.close();\n }\n}\n\nexport function getContentBatch(project: string, batchId: string): ContentBatchDetail {\n const database = lineageDb();\n try {\n const row = database.prepare('select * from content_batches where project_id = ? and id = ?').get(project, batchId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n const batch = batchFromRow(row);\n return { project, fetchedAt: nowIso(), batch, posts: postsForBatch(database, project, batch.id), handoff: handoff(project, batch.id) };\n } finally {\n database.close();\n }\n}\n\nexport function createContentBatch(project: string, fields: ContentBatchFields) {\n const batchId = requireText(fields.batchId, 'batch id');\n const preview = { id: batchId, project, title: requireText(fields.title, 'batch title'), campaign: fields.campaign, channel: fields.channel, notes: fields.notes };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would create content batch ${batchId}`, preview };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n ensureProject(database, project);\n database.prepare(`\n insert into content_batches (id, project_id, title, campaign, channel, status, notes, created_at, updated_at)\n values (?, ?, ?, ?, ?, 'active', ?, ?, ?)\n on conflict(project_id, id) do update set\n title = excluded.title, campaign = excluded.campaign, channel = excluded.channel,\n status = 'active', notes = excluded.notes, updated_at = excluded.updated_at\n `).run(batchId, project, preview.title, fields.campaign || null, fields.channel || null, fields.notes || null, timestamp, timestamp);\n return { ok: true, message: `Saved content batch ${batchId}`, batch: getContentBatch(project, batchId).batch };\n } finally {\n database.close();\n }\n}\n\nexport function createContentPost(project: string, fields: ContentPostFields) {\n const postId = requireText(fields.postId, 'post id');\n const batchId = requireText(fields.batchId, 'batch id');\n const phase = normalizePhase(fields.phase);\n const preview = { ...fields, postId, batchId, phase, project, title: requireText(fields.title, 'post title'), channel: requireText(fields.channel, 'post channel') };\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would create content post ${postId}`, preview };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n ensureProject(database, project);\n const batch = database.prepare('select id from content_batches where project_id = ? and id = ?').get(project, batchId);\n if (!batch) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n database.prepare(`\n insert into content_posts (\n id, project_id, batch_id, channel, title, phase, campaign, body, cta,\n scheduled_at, posted_at, url, notes, source_path, created_at, updated_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, id) do update set\n batch_id = excluded.batch_id, channel = excluded.channel, title = excluded.title,\n phase = excluded.phase, campaign = excluded.campaign, body = excluded.body,\n cta = excluded.cta, scheduled_at = excluded.scheduled_at, posted_at = excluded.posted_at,\n url = excluded.url, notes = excluded.notes, source_path = excluded.source_path,\n updated_at = excluded.updated_at\n `).run(postId, project, batchId, preview.channel, preview.title, phase, fields.campaign || null, fields.body || null, fields.cta || null, fields.scheduledAt || null, fields.postedAt || null, fields.url || null, fields.notes || null, fields.sourcePath || null, timestamp, timestamp);\n return { ok: true, message: `Saved content post ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nfunction findContentPost(database: DatabaseSync, project: string, postId: string): ContentPost {\n const row = database.prepare('select * from content_posts where project_id = ? and id = ?').get(project, postId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content post: ${postId}`, 404);\n return postFromRow(row, assetsForPost(database, project, postId));\n}\n\nexport function requireContentPostClaim(project: string, post: ContentPost, claimToken: string | undefined, writeKind: string): void {\n if (!claimToken && !hasActiveContentPostClaim(project, post)) return;\n const validation = validateAgentClaimForWrite({\n channel: post.channel,\n claimToken,\n confirmWrite: true,\n dangerLevel: 'enforce',\n project,\n scopeType: 'content_post',\n targetId: post.id,\n writeKind,\n });\n if (!validation.ok) {\n const status = validation.code === 'claim_required' || validation.code === 'claim_token_invalid' ? 401 : 409;\n throw new AgentClaimError(validation.message, status, validation.code, validation.conflicts);\n }\n}\n\nfunction hasActiveContentPostClaim(project: string, post: ContentPost): boolean {\n return listAgentClaims(project).claims.some(claim => {\n if (claim.project !== project || claim.status !== 'active' || claim.derived_state === 'expired') return false;\n if (claim.scope_type === 'content_post') return claim.target_id === post.id;\n return claim.scope_type === 'project_channel' && (!claim.channel || claim.channel === post.channel);\n });\n}\n\nexport function listContentPosts(project: string, filters: { batchId?: string; channel?: string; phase?: string } = {}) {\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select * from content_posts\n where project_id = ?\n order by updated_at desc, id\n `).all(project) as Record<string, unknown>[];\n const posts = rows.map(row => postFromRow(row, assetsForPost(database, project, String(row.id))))\n .filter(post => !filters.batchId || post.batch_id === filters.batchId)\n .filter(post => !filters.channel || post.channel === filters.channel)\n .filter(post => !filters.phase || post.phase === normalizePhase(filters.phase));\n return { project, fetchedAt: nowIso(), posts };\n } finally {\n database.close();\n }\n}\n\nexport function updateContentPost(project: string, fields: ContentPostUpdateFields) {\n const postId = requireText(fields.postId, 'post id');\n const phase = fields.phase ? normalizePhase(fields.phase) : undefined;\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would update content post ${postId}`, preview: { ...fields, phase, project } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, fields.phase ? 'content_post_phase' : 'content_post_update');\n if (fields.batchId) {\n const batch = database.prepare('select id from content_batches where project_id = ? and id = ?').get(project, fields.batchId);\n if (!batch) throw new ContentBatchError(`Unknown content batch: ${fields.batchId}`, 404);\n }\n const next = {\n batchId: fields.batchId ?? current.batch_id,\n body: fields.body ?? current.body,\n campaign: fields.campaign ?? current.campaign,\n channel: fields.channel ?? current.channel,\n cta: fields.cta ?? current.cta,\n notes: fields.notes ?? current.notes,\n phase: phase ?? current.phase,\n postedAt: fields.postedAt ?? current.posted_at,\n scheduledAt: fields.scheduledAt ?? current.scheduled_at,\n sourcePath: fields.sourcePath ?? current.source_path,\n title: fields.title ?? current.title,\n url: fields.url ?? current.url,\n };\n database.prepare(`\n update content_posts\n set batch_id = ?, channel = ?, title = ?, phase = ?, campaign = ?, body = ?, cta = ?,\n scheduled_at = ?, posted_at = ?, url = ?, notes = ?, source_path = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(next.batchId, next.channel, next.title, next.phase, next.campaign || null, next.body || null, next.cta || null, next.scheduledAt || null, next.postedAt || null, next.url || null, next.notes || null, next.sourcePath || null, timestamp, project, postId);\n return { ok: true, message: `Updated content post ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nexport function attachContentPostAsset(project: string, fields: ContentPostAssetFields) {\n const postId = requireText(fields.postId, 'post id');\n const assetId = requireText(fields.assetId, 'asset id');\n const role = fields.role?.trim() || 'primary';\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would attach ${assetId} to ${postId}`, preview: { postId, assetId, role, notes: fields.notes } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, 'content_post_attach_asset');\n database.prepare(`\n insert into content_post_assets (id, project_id, post_id, asset_id, role, notes, attached_at)\n values (?, ?, ?, ?, ?, ?, ?)\n on conflict(project_id, post_id, asset_id, role) do update set notes = excluded.notes, attached_at = excluded.attached_at\n `).run(`${project}:${postId}:${assetId}:${role}`, project, postId, assetId, role, fields.notes || null, timestamp);\n return { ok: true, message: `Attached ${assetId} to ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n\nexport function detachContentPostAsset(project: string, fields: ContentPostAssetFields) {\n const postId = requireText(fields.postId, 'post id');\n const assetId = requireText(fields.assetId, 'asset id');\n const role = fields.role?.trim() || 'primary';\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would detach ${assetId} from ${postId}`, preview: { postId, assetId, role } };\n const database = lineageDb();\n try {\n const current = findContentPost(database, project, postId);\n requireContentPostClaim(project, current, fields.claimToken, 'content_post_detach_asset');\n database.prepare('delete from content_post_assets where project_id = ? and post_id = ? and asset_id = ? and role = ?').run(project, postId, assetId, role);\n return { ok: true, message: `Detached ${assetId} from ${postId}`, post: findContentPost(database, project, postId) };\n } finally {\n database.close();\n }\n}\n", "import { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { ContentBatchError, requireContentPostClaim } from './contentBatches';\nimport { contentPostHandoff, readinessForPost } from './contentPostHandoff';\nimport type {\n ContentBatch,\n ContentPost,\n ContentPostAsset,\n ContentTargetFields,\n ContentTargetSnapshot,\n} from '../shared/types';\n\nfunction assetFromRow(row: Record<string, unknown>): ContentPostAsset {\n return {\n asset_id: String(row.asset_id),\n role: String(row.role),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n attached_at: String(row.attached_at),\n };\n}\n\nfunction batchFromRow(row: Record<string, unknown>): ContentBatch {\n return {\n id: String(row.id),\n project: String(row.project_id),\n title: String(row.title),\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n channel: typeof row.channel === 'string' ? row.channel : undefined,\n status: row.status === 'archived' ? 'archived' : 'active',\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n };\n}\n\nfunction assetsForPost(database: DatabaseSync, project: string, postId: string): ContentPostAsset[] {\n return (database.prepare(`\n select asset_id, role, notes, attached_at from content_post_assets\n where project_id = ? and post_id = ?\n order by attached_at desc, asset_id\n `).all(project, postId) as Record<string, unknown>[]).map(assetFromRow);\n}\n\nfunction postFromRow(row: Record<string, unknown>, assets: ContentPostAsset[]): ContentPost {\n return {\n id: String(row.id),\n project: String(row.project_id),\n batch_id: String(row.batch_id),\n channel: String(row.channel),\n title: String(row.title),\n phase: String(row.phase) as ContentPost['phase'],\n campaign: typeof row.campaign === 'string' ? row.campaign : undefined,\n body: typeof row.body === 'string' ? row.body : undefined,\n cta: typeof row.cta === 'string' ? row.cta : undefined,\n scheduled_at: typeof row.scheduled_at === 'string' ? row.scheduled_at : undefined,\n posted_at: typeof row.posted_at === 'string' ? row.posted_at : undefined,\n url: typeof row.url === 'string' ? row.url : undefined,\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n source_path: typeof row.source_path === 'string' ? row.source_path : undefined,\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n assets,\n };\n}\n\nfunction findPost(database: DatabaseSync, project: string, postId: string): ContentPost {\n const row = database.prepare('select * from content_posts where project_id = ? and id = ?').get(project, postId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content post: ${postId}`, 404);\n return postFromRow(row, assetsForPost(database, project, postId));\n}\n\nfunction findBatch(database: DatabaseSync, project: string, batchId: string): ContentBatch {\n const row = database.prepare('select * from content_batches where project_id = ? and id = ?').get(project, batchId) as Record<string, unknown> | undefined;\n if (!row) throw new ContentBatchError(`Unknown content batch: ${batchId}`, 404);\n return batchFromRow(row);\n}\n\nexport { readinessForPost };\n\nexport function getContentTarget(project: string): ContentTargetSnapshot {\n const database = lineageDb();\n try {\n const row = database.prepare('select post_id, notes, selected_at from content_targets where project_id = ?').get(project) as Record<string, unknown> | undefined;\n if (!row) return { fetchedAt: nowIso(), handoff: contentPostHandoff(project), project, selected: false, target: null };\n const postId = String(row.post_id);\n let post: ContentPost;\n try {\n post = findPost(database, project, postId);\n } catch (error) {\n if (error instanceof ContentBatchError && error.status === 404) {\n database.prepare('delete from content_targets where project_id = ?').run(project);\n return {\n fetchedAt: nowIso(),\n handoff: contentPostHandoff(project),\n project,\n selected: false,\n target: null,\n warning: `Selected content target ${postId} no longer exists and was cleared.`,\n };\n }\n throw error;\n }\n return {\n fetchedAt: nowIso(),\n handoff: contentPostHandoff(project, post),\n project,\n selected: true,\n target: {\n batch: findBatch(database, project, post.batch_id),\n handoff: contentPostHandoff(project, post),\n notes: typeof row.notes === 'string' ? row.notes : undefined,\n post,\n readiness: readinessForPost(post),\n selected_at: String(row.selected_at),\n },\n };\n } finally {\n database.close();\n }\n}\n\nexport function setContentTarget(project: string, fields: ContentTargetFields) {\n const postId = fields.postId.trim();\n if (!postId) throw new ContentBatchError('Content target post id is required');\n if (!fields.confirmWrite) return { ok: true, dryRun: true, message: `Would select content target ${postId}`, preview: { postId, notes: fields.notes } };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n const post = findPost(database, project, postId);\n requireContentPostClaim(project, post, fields.claimToken, 'content_target_set');\n database.prepare(`\n insert into content_targets (project_id, post_id, notes, selected_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(project_id) do update set\n post_id = excluded.post_id, notes = excluded.notes,\n selected_at = excluded.selected_at, updated_at = excluded.updated_at\n `).run(project, postId, fields.notes || null, timestamp, timestamp);\n } finally {\n database.close();\n }\n return { ok: true, message: `Selected content target ${postId}`, ...getContentTarget(project) };\n}\n\nexport function clearContentTarget(project: string, confirmWrite: boolean, claimToken?: string) {\n if (!confirmWrite) return { ok: true, dryRun: true, message: 'Would clear selected content target' };\n const database = lineageDb();\n try {\n const row = database.prepare('select post_id from content_targets where project_id = ?').get(project) as { post_id?: string } | undefined;\n if (row?.post_id) {\n try {\n const post = findPost(database, project, String(row.post_id));\n requireContentPostClaim(project, post, claimToken, 'content_target_clear');\n } catch (error) {\n if (!(error instanceof ContentBatchError && error.status === 404)) throw error;\n }\n }\n database.prepare('delete from content_targets where project_id = ?').run(project);\n } finally {\n database.close();\n }\n return { ok: true, message: 'Cleared selected content target', ...getContentTarget(project) };\n}\n", "import type express from 'express';\nimport type { AdapterProvider, AdapterType } from '../../shared/adapterSettingsTypes';\nimport { getAdapterSettings, updateAdapterSetting } from './adapterSettings';\nimport { getAdapterStatus } from './adapterStatus';\nimport { dryRunBufferContentPost } from './posting/bufferPostingService';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function registerAdapterRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/adapters/status', asyncRoute((req, res) => {\n res.json({ ok: true, ...getAdapterStatus(projectFrom(req)) });\n }));\n\n app.get('/api/adapters/settings', asyncRoute((req, res) => {\n res.json({ ok: true, ...getAdapterSettings(projectFrom(req)) });\n }));\n\n app.post('/api/adapters/settings/:adapterType/:provider', asyncRoute((req, res) => {\n res.json({\n ok: true,\n setting: updateAdapterSetting(projectFrom(req), {\n adapterType: req.params.adapterType as AdapterType,\n confirmWrite: req.body.confirmWrite === true,\n enabled: req.body.enabled === true,\n provider: req.params.provider as AdapterProvider,\n safeConfig: req.body.safeConfig && typeof req.body.safeConfig === 'object' ? req.body.safeConfig as Record<string, unknown> : undefined,\n }),\n });\n }));\n\n app.post('/api/adapters/posting/buffer/dry-run', asyncRoute((req, res) => {\n res.json(dryRunBufferContentPost(projectFrom(req), {\n bufferChannelId: String(req.body.bufferChannelId || req.body.bufferChannelID || req.body.buffer_channel_id || ''),\n execute: req.body.execute === true,\n postId: typeof req.body.postId === 'string' ? req.body.postId : undefined,\n target: req.body.target === 'selected' ? 'selected' : undefined,\n }));\n }));\n}\n", "import { Router, type Request } from 'express';\nimport {\n attachContentPostAsset,\n createContentBatch,\n createContentPost,\n detachContentPostAsset,\n getContentBatch,\n listContentBatches,\n listContentPosts,\n updateContentPost,\n} from './contentBatches';\nimport { importDemoContentBatch } from './contentBatchImport';\nimport { getContentOpsQueue } from './contentOpsQueue';\nimport { clearContentTarget, getContentTarget, setContentTarget } from './contentTargets';\nimport type { ContentPostPhase } from '../shared/types';\n\ntype ProjectResolver = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\n\nfunction stringBody(req: Request, key: string): string | undefined {\n const value = (req.body as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction boolBody(req: Request, key: string): boolean {\n return (req.body as Record<string, unknown>)[key] === true;\n}\n\nfunction claimTokenFromRequest(req: Request): string | undefined {\n const header = req.header('X-Lineage-Claim-Token');\n if (header) return header;\n const value = (req.body as Record<string, unknown>).claimToken;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction bodyProjectShape(req: Request): { body?: Record<string, unknown>; query?: Record<string, unknown> } {\n return { body: req.body as Record<string, unknown>, query: req.query };\n}\n\nexport function contentBatchRouter(projectFrom: ProjectResolver): Router {\n const router = Router();\n\n router.get('/batches', (req, res) => {\n res.json(listContentBatches(projectFrom(req)));\n });\n\n router.post('/batches', (req, res) => {\n res.json(createContentBatch(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || stringBody(req, 'id') || '',\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n notes: stringBody(req, 'notes'),\n title: stringBody(req, 'title') || '',\n }));\n });\n\n router.post('/import/demo', (req, res) => {\n const kind = stringBody(req, 'kind');\n res.json(importDemoContentBatch(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || '',\n campaign: stringBody(req, 'campaign'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n kind: kind === 'concepts' || kind === 'drafts' || kind === 'all' ? kind : 'all',\n title: stringBody(req, 'title'),\n }));\n });\n\n router.get('/target', (req, res) => {\n res.json(getContentTarget(projectFrom(req)));\n });\n\n router.get('/queue', (req, res) => {\n res.json(getContentOpsQueue(projectFrom(req)));\n });\n\n router.post('/target', (req, res) => {\n res.json(setContentTarget(projectFrom(bodyProjectShape(req)), {\n claimToken: claimTokenFromRequest(req),\n confirmWrite: boolBody(req, 'confirmWrite'),\n notes: stringBody(req, 'notes'),\n postId: stringBody(req, 'postId') || '',\n }));\n });\n\n router.post('/target/clear', (req, res) => {\n res.json(clearContentTarget(projectFrom(bodyProjectShape(req)), boolBody(req, 'confirmWrite'), claimTokenFromRequest(req)));\n });\n\n router.get('/batches/:batchId', (req, res) => {\n res.json(getContentBatch(projectFrom(req), req.params.batchId));\n });\n\n router.get('/posts', (req, res) => {\n res.json(listContentPosts(projectFrom(req), {\n batchId: typeof req.query.batchId === 'string' ? req.query.batchId : undefined,\n channel: typeof req.query.channel === 'string' ? req.query.channel : undefined,\n phase: typeof req.query.phase === 'string' ? req.query.phase : undefined,\n }));\n });\n\n router.post('/posts', (req, res) => {\n res.json(createContentPost(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId') || '',\n body: stringBody(req, 'body'),\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n cta: stringBody(req, 'cta'),\n notes: stringBody(req, 'notes'),\n phase: stringBody(req, 'phase') as ContentPostPhase | undefined,\n postId: stringBody(req, 'postId') || stringBody(req, 'id') || '',\n sourcePath: stringBody(req, 'sourcePath'),\n title: stringBody(req, 'title') || '',\n }));\n });\n\n router.post('/posts/:postId', (req, res) => {\n res.json(updateContentPost(projectFrom(bodyProjectShape(req)), {\n batchId: stringBody(req, 'batchId'),\n body: stringBody(req, 'body'),\n campaign: stringBody(req, 'campaign'),\n channel: stringBody(req, 'channel'),\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n cta: stringBody(req, 'cta'),\n notes: stringBody(req, 'notes'),\n phase: stringBody(req, 'phase') as ContentPostPhase | undefined,\n postedAt: stringBody(req, 'postedAt'),\n postId: req.params.postId,\n scheduledAt: stringBody(req, 'scheduledAt'),\n sourcePath: stringBody(req, 'sourcePath'),\n title: stringBody(req, 'title'),\n url: stringBody(req, 'url'),\n }));\n });\n\n router.post('/posts/:postId/assets', (req, res) => {\n res.json(attachContentPostAsset(projectFrom(bodyProjectShape(req)), {\n assetId: stringBody(req, 'assetId') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n notes: stringBody(req, 'notes'),\n postId: req.params.postId,\n role: stringBody(req, 'role'),\n }));\n });\n\n router.post('/posts/:postId/assets/detach', (req, res) => {\n res.json(detachContentPostAsset(projectFrom(bodyProjectShape(req)), {\n assetId: stringBody(req, 'assetId') || '',\n confirmWrite: boolBody(req, 'confirmWrite'),\n claimToken: claimTokenFromRequest(req),\n postId: req.params.postId,\n role: stringBody(req, 'role'),\n }));\n });\n\n return router;\n}\n", "import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { basename, join, relative } from 'node:path';\nimport { repoRoot } from './assetCore';\nimport { attachContentPostAsset, createContentBatch, createContentPost } from './contentBatches';\nimport type { ContentPostPhase } from '../shared/types';\n\ntype ImportKind = 'all' | 'concepts' | 'drafts';\n\ninterface MarkdownItem {\n body: string;\n campaign?: string;\n channel: string;\n cta?: string;\n kind: 'concept' | 'draft';\n postId: string;\n relatedAsset?: string;\n sourcePath: string;\n title: string;\n phase: ContentPostPhase;\n}\n\nexport interface ContentImportOptions {\n batchId: string;\n confirmWrite: boolean;\n campaign?: string;\n kind?: ImportKind;\n title?: string;\n}\n\nfunction walk(dir: string): string[] {\n return readdirSync(dir, { withFileTypes: true }).flatMap(entry => {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) return walk(path);\n return entry.isFile() && entry.name.endsWith('.md') ? [path] : [];\n });\n}\n\nfunction metadata(text: string): Record<string, string> {\n return Object.fromEntries(\n [...text.matchAll(/^- ([^:]+):\\s*(.+)$/gm)].map(match => [match[1].trim().toLowerCase(), match[2].trim()])\n );\n}\n\nfunction normalizeChannel(value: string): string {\n const channel = value.trim().toLowerCase();\n if (channel === 'linkedin') return 'linkedin';\n if (channel === 'tiktok') return 'tiktok';\n if (channel === 'youtube') return 'youtube';\n if (channel === 'meta') return 'meta';\n if (channel === 'x/twitter' || channel === 'twitter' || channel === 'x') return 'x-twitter';\n return channel;\n}\n\nfunction phaseFromStatus(value?: string): ContentPostPhase {\n const phase = value?.trim().toLowerCase().replace(/-/g, '_');\n if (phase === 'review' || phase === 'scheduled' || phase === 'posted' || phase === 'skipped' || phase === 'archived') return phase;\n return 'draft';\n}\n\nfunction postIdFor(kind: MarkdownItem['kind'], file: string): string {\n const slug = basename(file, '.md').replace(/^\\d{4}-\\d{2}-/, '');\n return `${kind}-${slug}`;\n}\n\nfunction itemFromFile(file: string): MarkdownItem | null {\n const parts = file.split('/');\n const kind = parts.includes('drafts') ? 'draft' : parts.includes('concepts') ? 'concept' : null;\n if (!kind) return null;\n const text = readFileSync(file, 'utf8');\n const meta = metadata(text);\n const pathChannel = parts[parts.indexOf('channels') + 1] || '';\n const relatedAsset = meta['related asset'] && meta['related asset'] !== 'none yet' ? meta['related asset'] : undefined;\n return {\n body: text,\n campaign: meta.campaign,\n channel: normalizeChannel(meta.channel || pathChannel),\n cta: meta.cta,\n kind,\n phase: phaseFromStatus(meta.status),\n postId: postIdFor(kind, file),\n relatedAsset,\n sourcePath: relative(repoRoot, file),\n title: text.match(/^#\\s+(.+)$/m)?.[1] || basename(file, '.md'),\n };\n}\n\nfunction demoMarkdownItems(kind: ImportKind): MarkdownItem[] {\n const root = process.env.LINEAGE_CONTENT_SOURCE_ROOT || join(repoRoot, 'demo-project', 'channels');\n if (!existsSync(root)) return [];\n return walk(root)\n .map(itemFromFile)\n .filter((item): item is MarkdownItem => Boolean(item))\n .filter(item => kind === 'all' || `${item.kind}s` === kind)\n .sort((a, b) => a.sourcePath.localeCompare(b.sourcePath));\n}\n\nexport function importDemoContentBatch(project: string, options: ContentImportOptions) {\n const kind = options.kind || 'all';\n const items = demoMarkdownItems(kind);\n const batch = {\n batchId: options.batchId,\n campaign: options.campaign || '2026-06-organic-traffic-test',\n confirmWrite: options.confirmWrite,\n notes: `Imported ${kind} from demo-project/channels markdown.`,\n title: options.title || 'Demo imported content batch',\n };\n if (!options.confirmWrite) {\n return { ok: true, dryRun: true, batch, counts: countsFor(items), items: previewItems(items) };\n }\n createContentBatch(project, batch);\n let attached = 0;\n for (const item of items) {\n createContentPost(project, {\n batchId: options.batchId,\n body: item.body,\n campaign: item.campaign || batch.campaign,\n channel: item.channel,\n confirmWrite: true,\n cta: item.cta,\n notes: `Imported ${item.kind} from ${item.sourcePath}`,\n phase: item.phase,\n postId: item.postId,\n sourcePath: item.sourcePath,\n title: item.title,\n });\n if (item.relatedAsset) {\n attachContentPostAsset(project, { assetId: item.relatedAsset, confirmWrite: true, postId: item.postId, role: 'related' });\n attached += 1;\n }\n }\n return { ok: true, batch_id: options.batchId, counts: { ...countsFor(items), attached }, items: previewItems(items) };\n}\n\nfunction countsFor(items: MarkdownItem[]) {\n return {\n concepts: items.filter(item => item.kind === 'concept').length,\n drafts: items.filter(item => item.kind === 'draft').length,\n total: items.length,\n };\n}\n\nfunction previewItems(items: MarkdownItem[]) {\n return items.map(item => ({\n channel: item.channel,\n kind: item.kind,\n phase: item.phase,\n post_id: item.postId,\n related_asset: item.relatedAsset,\n source_path: item.sourcePath,\n title: item.title,\n }));\n}\n", "import { listAssets } from './assetCore';\nimport { getAssetReviewMap } from './assetReviews';\nimport { nowIso } from './assetLineageDb';\nimport { listContentPosts } from './contentBatches';\nimport { getContentTarget, readinessForPost } from './contentTargets';\nimport type { AssetReviewState, ContentOpsQueueAssetStorage, ContentOpsQueueBackupCue, ContentOpsQueueItem, ContentOpsQueueLane, ContentOpsQueueLaneId, ContentOpsQueueLaneSummary, ContentOpsQueueSnapshot, ContentPost } from '../shared/types';\n\nconst lanes = [\n ['next_target', 'Next Target'],\n ['needs_asset', 'Needs Assets'],\n ['draft_ready', 'Draft Ready'],\n ['in_review', 'In Review'],\n ['scheduled', 'Scheduled'],\n ['posted', 'Posted'],\n ['skipped_or_archived', 'Skipped or Archived'],\n] satisfies Array<[ContentOpsQueueLaneId, string]>;\n\ntype AssetSources = { local: boolean; review_state?: AssetReviewState; s3: boolean };\nconst actionableLaneOrder: ContentOpsQueueLaneId[] = ['needs_asset', 'draft_ready', 'in_review', 'scheduled'];\n\nfunction emptyStorage(): ContentOpsQueueAssetStorage {\n return { local: 0, s3: 0, total: 0, unresolved: 0 };\n}\n\nfunction addStorage(left: ContentOpsQueueAssetStorage, right: ContentOpsQueueAssetStorage): ContentOpsQueueAssetStorage {\n return {\n local: left.local + right.local,\n s3: left.s3 + right.s3,\n total: left.total + right.total,\n unresolved: left.unresolved + right.unresolved,\n };\n}\n\nfunction collectAssetSources(project: string): Map<string, AssetSources> {\n const sources = new Map<string, AssetSources>();\n const pageSize = 100;\n let page = 1;\n while (true) {\n const snapshot = listAssets(project, { page, pageSize, source: 'all' });\n for (const asset of snapshot.assets) {\n const current = sources.get(asset.asset_id) || { local: false, s3: false };\n sources.set(asset.asset_id, {\n local: current.local || Boolean(asset.local),\n s3: current.s3 || Boolean(asset.s3),\n });\n }\n if (page >= snapshot.pagination.totalPages) break;\n page += 1;\n }\n const localAssetIds = [...sources].filter(([, source]) => source.local).map(([assetId]) => assetId);\n const reviewMap = getAssetReviewMap(project, localAssetIds);\n for (const assetId of localAssetIds) {\n const source = sources.get(assetId);\n if (source) source.review_state = reviewMap[assetId]?.review_state || 'unreviewed';\n }\n return sources;\n}\n\nfunction storageForPost(post: ContentPost, sources: Map<string, AssetSources>): ContentOpsQueueAssetStorage {\n return post.assets.reduce((storage, asset) => {\n const source = sources.get(asset.asset_id);\n return {\n local: storage.local + (source?.local ? 1 : 0),\n s3: storage.s3 + (source?.s3 ? 1 : 0),\n total: storage.total + 1,\n unresolved: storage.unresolved + (!source?.local && !source?.s3 ? 1 : 0),\n };\n }, emptyStorage());\n}\n\nfunction backupCueForPost(project: string, post: ContentPost, sources: Map<string, AssetSources>): ContentOpsQueueBackupCue | undefined {\n let approvedLocal = 0;\n let localAndS3 = 0;\n let localOnly = 0;\n let needsReview = 0;\n let s3Backed = 0;\n let unresolved = 0;\n let firstLocalOnly = '';\n for (const asset of post.assets) {\n const source = sources.get(asset.asset_id);\n if (source?.local && source.s3) localAndS3 += 1;\n else if (source?.local) {\n localOnly += 1;\n firstLocalOnly ||= asset.asset_id;\n if (source.review_state === 'approved') approvedLocal += 1;\n else needsReview += 1;\n } else if (source?.s3) s3Backed += 1;\n else unresolved += 1;\n }\n if (post.assets.length === 0) return undefined;\n const label = localOnly > 0\n ? `${localOnly} local-only${needsReview > 0 ? ` \u00B7 ${needsReview} need review before backup` : ' \u00B7 approved for backup'}`\n : localAndS3 > 0 ? `${localAndS3} local + S3 backed`\n : s3Backed > 0 ? `${s3Backed} S3 backed`\n : `${unresolved} unresolved`;\n return {\n approved_local: approvedLocal,\n label,\n local_and_s3: localAndS3,\n local_backup_command: firstLocalOnly ? `npx lineage local backup --project ${project} --asset-id ${firstLocalOnly} --dry-run --json` : undefined,\n local_only: localOnly,\n local_queue_command: firstLocalOnly ? `npx lineage local queue --project ${project} --json` : undefined,\n local_review_command: firstLocalOnly ? `npx lineage local review --project ${project} --asset-id ${firstLocalOnly} --state approved --dry-run --json` : undefined,\n needs_review: needsReview,\n s3_backed: s3Backed,\n unresolved,\n };\n}\n\nfunction itemFor(project: string, post: ContentPost, targetPostId: string | undefined, sources: Map<string, AssetSources>): ContentOpsQueueItem {\n const readiness = post.readiness || readinessForPost(post);\n return {\n asset_storage: storageForPost(post, sources),\n attached_asset_count: post.assets.length,\n backup_cue: backupCueForPost(project, post, sources),\n handoff: post.handoff,\n is_target: post.id === targetPostId,\n post,\n readiness,\n };\n}\n\nfunction laneFor(id: ContentOpsQueueLaneId, items: ContentOpsQueueItem[]): ContentOpsQueueLane {\n const label = lanes.find(([laneId]) => laneId === id)?.[1] || id;\n return { id, label, items, total: items.length };\n}\n\nfunction laneSummary(lane: ContentOpsQueueLane): ContentOpsQueueLaneSummary {\n return { id: lane.id, label: lane.label, total: lane.total };\n}\n\nfunction prefix(): string {\n return `npx lineage content queue`;\n}\n\nfunction compactItem(item: ContentOpsQueueItem | undefined) {\n if (!item) return null;\n return {\n asset_storage: item.asset_storage,\n attached_asset_count: item.attached_asset_count,\n batch_id: item.post.batch_id,\n channel: item.post.channel,\n is_target: item.is_target,\n next_commands: {\n attachAssetTemplate: item.handoff?.attachAssetTemplate,\n inspectBatchCommand: item.handoff?.inspectBatchCommand,\n markPostedTemplate: item.handoff?.markPostedTemplate,\n moveToReviewCommand: item.handoff?.moveToReviewCommand,\n scheduleTemplate: item.handoff?.scheduleTemplate,\n setTargetTemplate: item.handoff?.setTargetTemplate,\n },\n backup_cue: item.backup_cue,\n phase: item.post.phase,\n post_id: item.post.id,\n readiness: item.readiness,\n title: item.post.title,\n };\n}\n\nfunction firstLaneItem(queueLanes: ContentOpsQueueLane[], laneOrder: ContentOpsQueueLaneId[]): { item: ContentOpsQueueItem; lane: ContentOpsQueueLane } | null {\n for (const laneId of laneOrder) {\n const lane = queueLanes.find(candidate => candidate.id === laneId);\n const item = lane?.items[0];\n if (lane && item) return { item, lane };\n }\n return null;\n}\n\nfunction compactHandoff(project: string, queue: ContentOpsQueueSnapshot) {\n return {\n ...queue.handoff,\n inspectSummaryCommand: `${prefix()} inspect --project ${project} --summary --json`,\n nextQueueCommand: `${prefix()} next --project ${project} --json`,\n };\n}\n\nexport function getContentOpsQueue(project: string): ContentOpsQueueSnapshot {\n const posts = listContentPosts(project).posts;\n const target = getContentTarget(project);\n const targetPostId = target.target?.post.id;\n const sources = collectAssetSources(project);\n const items = posts.map(post => itemFor(project, post, targetPostId, sources));\n const queueLanes = lanes.map(([id]) => {\n const laneItems = id === 'next_target'\n ? items.filter(item => item.is_target)\n : items.filter(item => item.readiness === id);\n return laneFor(id, laneItems);\n });\n const nextAction = firstLaneItem(queueLanes, actionableLaneOrder);\n const storage = items.reduce((total, item) => addStorage(total, item.asset_storage), emptyStorage());\n const laneTotals = Object.fromEntries(queueLanes.map(lane => [lane.id, lane.total])) as Record<ContentOpsQueueLaneId, number>;\n const contentPrefix = `npx lineage content`;\n return {\n fetchedAt: nowIso(),\n handoff: {\n inspectQueueCommand: `${contentPrefix} queue inspect --project ${project} --json`,\n inspectTargetCommand: `${contentPrefix} target inspect --project ${project} --json`,\n listPostsCommand: `${contentPrefix} post list --project ${project} --json`,\n },\n lanes: queueLanes,\n next_action: nextAction?.item || null,\n next_action_lane: nextAction ? laneSummary(nextAction.lane) : null,\n project,\n target: target.target,\n totals: {\n attached_assets: items.reduce((sum, item) => sum + item.attached_asset_count, 0),\n lanes: laneTotals,\n posts: posts.length,\n selected_target: target.selected ? 1 : 0,\n storage,\n },\n warning: target.warning,\n };\n}\n\nexport function getContentOpsQueueSummary(project: string) {\n const queue = getContentOpsQueue(project);\n const nextAction = queue.next_action && queue.next_action_lane ? { item: queue.next_action, lane: queue.next_action_lane } : null;\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lanes: queue.totals.lanes,\n next: compactItem(nextAction?.item),\n next_action: compactItem(nextAction?.item),\n next_action_lane: nextAction?.lane.id || null,\n next_lane: nextAction?.lane.id || null,\n project: queue.project,\n storage: queue.totals.storage,\n target: compactItem(queue.lanes.find(lane => lane.id === 'next_target')?.items[0]),\n totals: {\n attached_assets: queue.totals.attached_assets,\n posts: queue.totals.posts,\n selected_target: queue.totals.selected_target,\n },\n warning: queue.warning,\n };\n}\n\nexport function getContentOpsQueueNext(project: string) {\n const queue = getContentOpsQueue(project);\n const nextAction = queue.next_action && queue.next_action_lane ? { item: queue.next_action, lane: queue.next_action_lane } : null;\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lane: nextAction ? nextAction.lane : null,\n next: compactItem(nextAction?.item),\n next_action: compactItem(nextAction?.item),\n next_action_lane: nextAction?.lane.id || null,\n project: queue.project,\n storage: queue.totals.storage,\n target: compactItem(queue.lanes.find(lane => lane.id === 'next_target')?.items[0]),\n warning: queue.warning || (nextAction ? undefined : 'No actionable content queue item found.'),\n };\n}\n\nexport function getContentOpsQueueLane(project: string, laneId: ContentOpsQueueLaneId) {\n const queue = getContentOpsQueue(project);\n const lane = queue.lanes.find(item => item.id === laneId);\n if (!lane) throw new Error(`Unknown content queue lane: ${laneId}`);\n return {\n fetchedAt: queue.fetchedAt,\n handoff: compactHandoff(project, queue),\n lane: {\n id: lane.id,\n items: lane.items.map(compactItem),\n label: lane.label,\n total: lane.total,\n },\n project: queue.project,\n storage: queue.totals.storage,\n totals: queue.totals,\n warning: queue.warning,\n };\n}\n", "import { existsSync, realpathSync, statSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { defaultProject, repoRoot } from './assetCore';\nimport { getLineageNextAsset, getLineageSnapshot, indexLineageAssets, listLineageRerollRequests, recordLineageRerollAttempt } from './assetLineage';\nimport { lineageDb, nowIso, type DatabaseSync } from './assetLineageDb';\nimport { cancelLineageIterateTasksForAssets, listLineageTasks, resolveLineageTask } from './assetLineageTasks';\nimport { activeLineageWorkspaceRoot } from './assetLineageWorkspaces';\nimport { contentTypeFor, fileSha256 } from './localReview';\nimport type {\n GenerationHandoffPacket,\n GenerationImportResponse,\n GenerationInspectResponse,\n GenerationJob,\n GenerationJobInput,\n GenerationJobOutput,\n GenerationJobReceipt,\n GenerationPlanResponse,\n GenerationProvider,\n GenerationSourceMode,\n LineageNextResponse,\n LineageRerollRequest,\n} from '../shared/types';\n\nconst adapterVersion = 'generation-receipts-v1';\nconst provider: GenerationProvider = 'codex-handoff';\n\nclass GenerationReceiptError extends Error {\n constructor(message: string, public status = 400) {\n super(message);\n }\n}\n\nexport function isGenerationReceiptError(error: unknown): error is GenerationReceiptError {\n return error instanceof GenerationReceiptError;\n}\n\nfunction jobId(): string {\n return `gen-${Date.now().toString(36)}-${randomUUID().slice(0, 8)}`;\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n return JSON.parse(value) as T;\n}\n\nfunction positiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) > 0;\n}\n\nfunction resolveLineageSelection(project: string): LineageNextResponse {\n const rootAssetId = activeLineageWorkspaceRoot(project);\n if (!rootAssetId) throw new GenerationReceiptError('No active lineage workspace for generation planning');\n const next = getLineageNextAsset(project, rootAssetId);\n if (!next.next_asset) throw new GenerationReceiptError(`No clear lineage next asset: ${next.reason}`);\n if (next.strategy !== 'selected') throw new GenerationReceiptError('Generation v1 requires an explicit selected lineage next base');\n if (next.selection_mode !== 'multiple' && next.selection?.asset_id !== next.next_asset.asset_id) throw new GenerationReceiptError('Generation v1 requires one explicit selected lineage next base');\n return next;\n}\n\nfunction selectedParents(next: LineageNextResponse) {\n const parents = next.next_assets.length > 0 ? next.next_assets : next.next_asset ? [next.next_asset] : [];\n if (parents.length === 0) throw new GenerationReceiptError('Missing lineage next base');\n return parents;\n}\n\nfunction parentMappings(next: LineageNextResponse, perBaseCount: number) {\n return selectedParents(next).map((parent, parentIndex) => ({\n parent,\n output_indexes: Array.from({ length: perBaseCount }, (_value, index) => parentIndex * perBaseCount + index),\n }));\n}\n\nfunction buildHandoff(project: string, id: string, prompt: string, count: number, perBaseCount: number, next: LineageNextResponse): GenerationHandoffPacket {\n const parent = next.next_asset;\n if (!parent) throw new GenerationReceiptError('Missing lineage next base');\n const parents = parentMappings(next, perBaseCount);\n const importFilesFlag = parents.length > 1\n ? `--parent-files ${quote(parents.map(mapping => `${mapping.parent.asset_id}=<${mapping.output_indexes.map(index => `file-${index}`).join(',')}>`).join(';'))}`\n : '--files <comma-separated-.asset-scratch-files>';\n const importCommand = `npx lineage generate image import --project ${quote(project)} --job-id ${quote(id)} ${importFilesFlag} --confirm-write --json`;\n return {\n schema_version: 'lineage.generation_handoff.v1', provider, project, job_id: id, prompt, expected_output_count: count,\n per_base_count: next.selection_mode === 'multiple' ? perBaseCount : undefined,\n lineage: {\n root_asset_id: next.root_asset_id, parent_asset_id: parent.asset_id, selection_strategy: next.strategy,\n parent_title: parent.title, parent_local_path: parent.local_path, parent_s3_key: parent.s3_key,\n parents: parents.length > 1 ? parents.map(mapping => ({\n parent_asset_id: mapping.parent.asset_id, parent_title: mapping.parent.title,\n parent_local_path: mapping.parent.local_path, parent_s3_key: mapping.parent.s3_key, output_indexes: mapping.output_indexes,\n })) : undefined,\n },\n instructions: [\n 'Use Codex image generation outside Lineage server code.',\n 'Write generated output files under .asset-scratch before import.',\n 'Do not call live provider APIs from the CLI or server.',\n 'Import the exact expected output count with --confirm-write to persist lineage children.',\n 'For multiple selected bases, prefer --parent-files so each generated file is tied to its selected parent.',\n ],\n import_command: importCommand,\n guardrails: { live_generation: false, external_services: false, output_root: '.asset-scratch', confirm_write_required: true },\n };\n}\n\nfunction buildRerollHandoff(project: string, id: string, prompt: string, rootAssetId: string, target: { asset_id: string; title: string; local_path?: string; s3_key?: string }, request: LineageRerollRequest): GenerationHandoffPacket {\n const importCommand = `npx lineage reroll import --project ${quote(project)} --job-id ${quote(id)} --file <.asset-scratch-file> --confirm-write --json`;\n return {\n schema_version: 'lineage.generation_handoff.v1',\n provider,\n project,\n job_id: id,\n prompt,\n expected_output_count: 1,\n lineage: {\n root_asset_id: rootAssetId,\n parent_asset_id: target.asset_id,\n selection_strategy: 'reroll_request',\n parent_title: target.title,\n parent_local_path: target.local_path,\n parent_s3_key: target.s3_key,\n },\n instructions: [\n 'Use Codex image generation outside Lineage server code.',\n 'Write the regenerated output file under .asset-scratch before import.',\n 'Do not call live provider APIs from the CLI or server.',\n 'Import exactly one output with reroll import, not link-child or generate image import.',\n `Resolve re-roll request ${request.id}; do not create a visible lineage child edge.`,\n ],\n import_command: importCommand,\n guardrails: { live_generation: false, external_services: false, output_root: '.asset-scratch', confirm_write_required: true },\n };\n}\n\nfunction inputsFrom(jobIdValue: string, project: string, next: LineageNextResponse): GenerationJobInput[] {\n return selectedParents(next).map((parent, position) => ({\n id: `${jobIdValue}:input:${position}`,\n job_id: jobIdValue,\n project_id: project,\n asset_id: parent.asset_id,\n root_asset_id: next.root_asset_id,\n role: 'lineage_next_base',\n position,\n selection_strategy: next.strategy,\n selection_snapshot: next,\n }));\n}\n\nfunction receiptFrom(row: Record<string, unknown>): GenerationJobReceipt {\n return {\n id: String(row.id),\n job_id: String(row.job_id),\n receipt_type: row.receipt_type as GenerationJobReceipt['receipt_type'],\n status: row.status as GenerationJobReceipt['status'],\n command: String(row.command),\n payload: parseJson(String(row.payload_json), null),\n created_at: String(row.created_at),\n };\n}\n\nfunction outputFrom(row: Record<string, unknown>): GenerationJobOutput {\n return {\n id: String(row.id),\n job_id: String(row.job_id),\n project_id: String(row.project_id),\n output_index: Number(row.output_index),\n file_path: String(row.file_path),\n checksum_sha256: String(row.checksum_sha256),\n size_bytes: Number(row.size_bytes),\n content_type: String(row.content_type),\n imported_asset_id: String(row.imported_asset_id),\n parent_asset_id: String(row.parent_asset_id),\n imported_at: String(row.imported_at),\n };\n}\n\nexport function loadGenerationJob(database: DatabaseSync, project: string, id: string): GenerationJob {\n const row = database.prepare('select * from generation_jobs where project_id = ? and id = ?').get(project, id) as Record<string, unknown> | undefined;\n if (!row) throw new GenerationReceiptError(`Unknown generation job: ${id}`, 404);\n const inputRows = database.prepare('select * from generation_job_inputs where job_id = ? order by position').all(id) as Array<Record<string, unknown>>;\n const inputs = inputRows.map(input => ({\n id: String(input.id),\n job_id: String(input.job_id),\n project_id: String(input.project_id),\n asset_id: String(input.asset_id),\n root_asset_id: String(input.root_asset_id),\n role: input.role as GenerationJobInput['role'],\n position: Number(input.position),\n selection_strategy: String(input.selection_strategy),\n selection_snapshot: parseJson<LineageNextResponse>(String(input.selection_snapshot_json), {} as LineageNextResponse),\n }));\n const outputs = (database.prepare('select * from generation_job_outputs where job_id = ? order by output_index').all(id) as Array<Record<string, unknown>>).map(outputFrom);\n const receipts = (database.prepare('select * from generation_job_receipts where job_id = ? order by created_at, id').all(id) as Array<Record<string, unknown>>).map(receiptFrom);\n return {\n id: String(row.id),\n project_id: String(row.project_id),\n provider: row.provider as GenerationProvider,\n adapter_version: String(row.adapter_version),\n source_mode: String(row.source_mode) as GenerationSourceMode,\n root_asset_id: String(row.root_asset_id),\n prompt: String(row.prompt),\n expected_output_count: Number(row.expected_output_count),\n status: row.status as GenerationJob['status'],\n output_dir: typeof row.output_dir === 'string' ? row.output_dir : undefined,\n handoff: parseJson<GenerationHandoffPacket>(String(row.handoff_json), {} as GenerationHandoffPacket),\n created_at: String(row.created_at),\n updated_at: String(row.updated_at),\n imported_at: typeof row.imported_at === 'string' ? row.imported_at : undefined,\n inputs,\n outputs,\n receipts,\n };\n}\n\nfunction insertReceipt(database: DatabaseSync, id: string, type: 'plan' | 'import' | 'error', command: string, payload: unknown): void {\n database.prepare(`\n insert into generation_job_receipts (id, job_id, receipt_type, status, command, payload_json, created_at)\n values (?, ?, ?, 'ok', ?, ?, ?)\n `).run(`${id}:receipt:${type}:${Date.now()}`, id, type, command, JSON.stringify(payload), nowIso());\n}\n\nexport function planImageGeneration(project = defaultProject, fields: { prompt: string; count?: number; dryRun?: boolean; fromLineageSelection: boolean; perBaseCount?: number }): GenerationPlanResponse {\n const prompt = fields.prompt.trim();\n if (!prompt) throw new GenerationReceiptError('Missing --prompt');\n if (!fields.fromLineageSelection) throw new GenerationReceiptError('Generation v1 requires --from-lineage-selection');\n const next = resolveLineageSelection(project);\n const parentCount = selectedParents(next).length;\n if (parentCount > 1 && !positiveInteger(fields.perBaseCount)) throw new GenerationReceiptError('Multi-parent generation requires --per-base-count');\n const perBaseCount = parentCount > 1 ? Number(fields.perBaseCount) : Number(fields.count ?? fields.perBaseCount);\n const count = parentCount * perBaseCount;\n if (!positiveInteger(perBaseCount)) throw new GenerationReceiptError('Generation count must be a positive integer');\n if (fields.count !== undefined && fields.count !== count) throw new GenerationReceiptError(`Generation count mismatch: expected ${count} from selected bases, received ${fields.count}`);\n const id = jobId();\n const handoff = buildHandoff(project, id, prompt, count, perBaseCount, next);\n const inputs = inputsFrom(id, project, next);\n const mappings = parentMappings(next, perBaseCount).map(mapping => ({ parent_asset_id: mapping.parent.asset_id, output_indexes: mapping.output_indexes }));\n const timestamp = nowIso();\n const preview: GenerationJob = {\n id,\n project_id: project,\n provider,\n adapter_version: adapterVersion,\n source_mode: 'lineage_selection',\n root_asset_id: next.root_asset_id,\n prompt,\n expected_output_count: count,\n status: 'planned',\n output_dir: '.asset-scratch',\n handoff,\n created_at: timestamp,\n updated_at: timestamp,\n inputs,\n outputs: [],\n receipts: [{\n id: `${id}:receipt:plan:preview`,\n job_id: id,\n receipt_type: 'plan',\n status: 'ok',\n command: 'generate image plan',\n payload: { prompt, expected_output_count: count, per_base_count: parentCount > 1 ? perBaseCount : undefined, lineage: handoff.lineage, parent_mappings: mappings },\n created_at: timestamp,\n }],\n };\n if (fields.dryRun) return { ok: true, command: 'generate image plan', project, dryRun: true, wouldWrite: true, job: preview };\n\n const database = lineageDb();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(`\n insert into generation_jobs (\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at\n ) values (?, ?, ?, ?, 'lineage_selection', ?, ?, ?, 'planned', ?, ?, ?, ?)\n `).run(id, project, provider, adapterVersion, next.root_asset_id, prompt, count, '.asset-scratch', JSON.stringify(handoff), timestamp, timestamp);\n const insertInput = database.prepare('insert into generation_job_inputs (id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json) values (?, ?, ?, ?, ?, ?, ?, ?, ?)');\n for (const input of inputs) insertInput.run(input.id, id, project, input.asset_id, input.root_asset_id, input.role, input.position, input.selection_strategy, JSON.stringify(next));\n insertReceipt(database, id, 'plan', 'generate image plan', preview.receipts[0].payload);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, command: 'generate image plan', project, job: loadGenerationJob(database, project, id) };\n } finally {\n database.close();\n }\n}\n\nexport function planImageReroll(project = defaultProject, fields: { rootAssetId: string; targetAssetId: string; prompt: string; dryRun?: boolean }): GenerationPlanResponse {\n const prompt = fields.prompt.trim();\n if (!prompt) throw new GenerationReceiptError('Missing --prompt');\n if (!fields.rootAssetId) throw new GenerationReceiptError('Missing --root');\n if (!fields.targetAssetId) throw new GenerationReceiptError('Missing --target');\n const snapshot = getLineageSnapshot(project, fields.rootAssetId);\n const target = snapshot.nodes.find(node => node.asset_id === fields.targetAssetId);\n if (!target) throw new GenerationReceiptError(`Re-roll target is not in lineage: ${fields.targetAssetId}`, 404);\n const request = listLineageRerollRequests(project, snapshot.root_asset_id).requests.find(item => item.node_asset_id === fields.targetAssetId);\n if (!request) throw new GenerationReceiptError(`No pending re-roll request for ${fields.targetAssetId}`);\n const id = jobId();\n const timestamp = nowIso();\n const handoff = buildRerollHandoff(project, id, prompt, snapshot.root_asset_id, target, request);\n const input: GenerationJobInput = {\n id: `${id}:input:0`,\n job_id: id,\n project_id: project,\n asset_id: target.asset_id,\n root_asset_id: snapshot.root_asset_id,\n role: 'reroll_target',\n position: 0,\n selection_strategy: 'reroll_request',\n selection_snapshot: {\n project,\n root_asset_id: snapshot.root_asset_id,\n strategy: 'selected',\n selection_mode: 'single',\n recommended_action: 'evolve_variations',\n reason: 'user_selected',\n next_asset: target,\n next_assets: [target],\n latest: snapshot.latest,\n selected: [target.asset_id],\n selection: null,\n selections: [],\n candidates: snapshot.nodes,\n warnings: ['Re-roll target: import output as an attempt, not a lineage child.'],\n fetchedAt: timestamp,\n },\n };\n const preview: GenerationJob = {\n id,\n project_id: project,\n provider,\n adapter_version: adapterVersion,\n source_mode: 'lineage_reroll',\n root_asset_id: snapshot.root_asset_id,\n prompt,\n expected_output_count: 1,\n status: 'planned',\n output_dir: '.asset-scratch',\n handoff,\n created_at: timestamp,\n updated_at: timestamp,\n inputs: [input],\n outputs: [],\n receipts: [{\n id: `${id}:receipt:plan:preview`,\n job_id: id,\n receipt_type: 'plan',\n status: 'ok',\n command: 'reroll plan',\n payload: { prompt, expected_output_count: 1, lineage: handoff.lineage, reroll_request_id: request.id },\n created_at: timestamp,\n }],\n };\n if (fields.dryRun) return { ok: true, command: 'reroll plan', project, dryRun: true, wouldWrite: true, job: preview };\n const database = lineageDb();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(`\n insert into generation_jobs (\n id, project_id, provider, adapter_version, source_mode, root_asset_id, prompt,\n expected_output_count, status, output_dir, handoff_json, created_at, updated_at\n ) values (?, ?, ?, ?, 'lineage_reroll', ?, ?, 1, 'planned', ?, ?, ?, ?)\n `).run(id, project, provider, adapterVersion, snapshot.root_asset_id, prompt, '.asset-scratch', JSON.stringify(handoff), timestamp, timestamp);\n database.prepare('insert into generation_job_inputs (id, job_id, project_id, asset_id, root_asset_id, role, position, selection_strategy, selection_snapshot_json) values (?, ?, ?, ?, ?, ?, ?, ?, ?)')\n .run(input.id, id, project, input.asset_id, input.root_asset_id, input.role, input.position, input.selection_strategy, JSON.stringify(input.selection_snapshot));\n insertReceipt(database, id, 'plan', 'reroll plan', preview.receipts[0].payload);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n return { ok: true, command: 'reroll plan', project, job: loadGenerationJob(database, project, id) };\n } finally {\n database.close();\n }\n}\n\nfunction parentForOutput(job: GenerationJob, outputIndex: number): string {\n const inputs = job.inputs.filter(input => input.role === 'lineage_next_base');\n if (inputs.length === 0) throw new GenerationReceiptError('Generation job has no lineage_next_base input');\n if (inputs.length === 1) return inputs[0].asset_id;\n if (job.expected_output_count % inputs.length !== 0) throw new GenerationReceiptError('Generation job has invalid parent mapping');\n return inputs[Math.floor(outputIndex / (job.expected_output_count / inputs.length))]?.asset_id || inputs[inputs.length - 1].asset_id;\n}\n\nfunction parentInputs(job: GenerationJob): GenerationJobInput[] {\n const inputs = job.inputs.filter(input => input.role === 'lineage_next_base');\n if (inputs.length === 0) throw new GenerationReceiptError('Generation job has no lineage_next_base input');\n return inputs;\n}\n\nfunction parentFilesFor(job: GenerationJob, parentFiles: Record<string, string[]>): Array<{ file: string; parentAssetId: string }> {\n const inputs = parentInputs(job);\n const expectedPerParent = job.expected_output_count / inputs.length;\n if (!Number.isInteger(expectedPerParent)) throw new GenerationReceiptError('Generation job has invalid parent mapping');\n const allowedParents = new Set(inputs.map(input => input.asset_id));\n const seenParents = new Set<string>();\n const mapped: Array<{ file: string; parentAssetId: string }> = [];\n for (const parentAssetId of Object.keys(parentFiles)) {\n if (!allowedParents.has(parentAssetId)) throw new GenerationReceiptError(`Unknown generation parent mapping: ${parentAssetId}`);\n if (seenParents.has(parentAssetId)) throw new GenerationReceiptError(`Duplicate generation parent mapping: ${parentAssetId}`);\n seenParents.add(parentAssetId);\n }\n for (const input of inputs) {\n const files = (parentFiles[input.asset_id] || []).map(file => file.trim()).filter(Boolean);\n if (files.length === 0) throw new GenerationReceiptError(`Missing generation parent mapping for ${input.asset_id}`);\n if (files.length !== expectedPerParent) throw new GenerationReceiptError(`Parent ${input.asset_id} requires ${expectedPerParent} output file${expectedPerParent === 1 ? '' : 's'}, received ${files.length}`);\n for (const file of files) mapped.push({ file, parentAssetId: input.asset_id });\n }\n return mapped;\n}\n\nfunction orderedFilesFor(job: GenerationJob, files: string[]): Array<{ file: string; parentAssetId: string }> {\n return files.map((file, index) => ({ file, parentAssetId: parentForOutput(job, index) }));\n}\n\nexport function inspectImageGeneration(project = defaultProject, jobIdValue: string): GenerationInspectResponse {\n if (!jobIdValue) throw new GenerationReceiptError('Missing --job-id');\n const database = lineageDb();\n try {\n return { ok: true, command: 'generate image inspect', project, job: loadGenerationJob(database, project, jobIdValue) };\n } finally {\n database.close();\n }\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const rel = relative(parent, child);\n return Boolean(rel) && !rel.startsWith('..') && !rel.startsWith('/');\n}\n\nfunction resolveScratchFile(file: string): { relativePath: string; checksum: string; size: number; contentType: string; assetId: string } {\n const scratchRoot = resolve(repoRoot, '.asset-scratch');\n const candidate = file.startsWith('.asset-scratch/') || resolve(file).startsWith(scratchRoot)\n ? resolve(repoRoot, file)\n : resolve(scratchRoot, file);\n if (!isPathInside(candidate, scratchRoot)) throw new GenerationReceiptError(`Import file must be under .asset-scratch: ${file}`);\n if (!existsSync(candidate)) throw new GenerationReceiptError(`Missing import file: ${file}`, 404);\n const realScratchRoot = realpathSync(scratchRoot);\n const realCandidate = realpathSync(candidate);\n if (!isPathInside(realCandidate, realScratchRoot)) throw new GenerationReceiptError(`Import file must be under .asset-scratch: ${file}`);\n const stats = statSync(candidate);\n if (!stats.isFile()) throw new GenerationReceiptError(`Import path is not a file: ${file}`);\n const checksum = fileSha256(candidate);\n return {\n relativePath: relative(scratchRoot, candidate),\n checksum,\n size: stats.size,\n contentType: contentTypeFor(candidate),\n assetId: `local-${checksum.slice(0, 12)}`,\n };\n}\n\nexport function importImageGenerationOutputs(project = defaultProject, fields: { jobId: string; files?: string[]; parentFiles?: Record<string, string[]>; confirmWrite: boolean }): GenerationImportResponse {\n if (!fields.jobId) throw new GenerationReceiptError('Missing --job-id');\n if (!fields.confirmWrite) throw new GenerationReceiptError('Generation import requires --confirm-write');\n const database = lineageDb();\n let job: GenerationJob;\n try {\n job = loadGenerationJob(database, project, fields.jobId);\n } finally {\n database.close();\n }\n if (job.status !== 'planned') throw new GenerationReceiptError(`Generation job is not importable from status: ${job.status}`);\n const hasExplicitParentFiles = Boolean(fields.parentFiles && Object.keys(fields.parentFiles).length > 0);\n const hasOrderedFiles = Boolean(fields.files && fields.files.map(file => file.trim()).filter(Boolean).length > 0);\n if (hasExplicitParentFiles && hasOrderedFiles) throw new GenerationReceiptError('Use --files or --parent-files, not both');\n const parentFileRows = hasExplicitParentFiles\n ? parentFilesFor(job, fields.parentFiles || {})\n : orderedFilesFor(job, (fields.files || []).map(file => file.trim()).filter(Boolean));\n if (parentFileRows.length === 0) throw new GenerationReceiptError('Generation import requires --files or --parent-files');\n if (parentFileRows.length !== job.expected_output_count) {\n throw new GenerationReceiptError(`Output count mismatch: expected ${job.expected_output_count}, received ${parentFileRows.length}`);\n }\n const resolved = parentFileRows.map(row => ({ ...resolveScratchFile(row.file), parentAssetId: row.parentAssetId }));\n const uniquePaths = new Set(resolved.map(file => file.relativePath));\n if (uniquePaths.size !== resolved.length) throw new GenerationReceiptError('Generation import files must be unique');\n cancelLineageIterateTasksForAssets(project, {\n actor: 'system',\n confirmWrite: false,\n rootAssetId: job.root_asset_id,\n });\n indexLineageAssets(project);\n const writeDb = lineageDb();\n try {\n const timestamp = nowIso();\n writeDb.exec('BEGIN IMMEDIATE');\n try {\n for (const [index, file] of resolved.entries()) {\n const assetRow = writeDb.prepare('select id from assets where project_id = ? and id = ?').get(project, file.assetId);\n if (!assetRow) throw new GenerationReceiptError(`Indexed local asset was not found: ${file.relativePath}`);\n const outputId = `${fields.jobId}:output:${index}`;\n writeDb.prepare(`insert into generation_job_outputs (\n id, job_id, project_id, output_index, file_path, checksum_sha256, size_bytes, content_type, imported_asset_id, parent_asset_id, imported_at\n ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(outputId, fields.jobId, project, index, file.relativePath, file.checksum, file.size, file.contentType, file.assetId, file.parentAssetId, timestamp);\n writeDb.prepare(`insert into asset_edges (id, project_id, parent_asset_id, child_asset_id, relation_type, created_at)\n values (?, ?, ?, ?, 'derived_from', ?) on conflict(project_id, parent_asset_id, child_asset_id, relation_type) do nothing`)\n .run(`${project}:${file.parentAssetId}:derived_from:${file.assetId}`, project, file.parentAssetId, file.assetId, timestamp);\n }\n writeDb.prepare(`\n update generation_jobs\n set status = 'imported', imported_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, timestamp, project, fields.jobId);\n insertReceipt(writeDb, fields.jobId, 'import', 'generate image import', {\n mapping_strategy: hasExplicitParentFiles ? 'explicit_parent_files' : 'ordered_per_base',\n files: resolved.map((file, index) => ({ output_index: index, file_path: file.relativePath, imported_asset_id: file.assetId, parent_asset_id: file.parentAssetId })),\n selection_reset: { root_asset_id: job.root_asset_id, cleared: true },\n });\n writeDb.prepare('delete from asset_selections where project_id = ? and root_asset_id = ?').run(project, job.root_asset_id);\n writeDb.exec('COMMIT');\n } catch (error) {\n writeDb.exec('ROLLBACK');\n throw error;\n }\n cancelLineageIterateTasksForAssets(project, {\n actor: 'system',\n confirmWrite: true,\n rootAssetId: job.root_asset_id,\n });\n const importedJob = loadGenerationJob(writeDb, project, fields.jobId);\n return { ok: true, command: 'generate image import', project, job: importedJob, imported: importedJob.outputs };\n } finally {\n writeDb.close();\n }\n}\n\nexport function importImageRerollOutput(project = defaultProject, fields: { jobId: string; file: string; confirmWrite: boolean }): GenerationImportResponse {\n if (!fields.jobId) throw new GenerationReceiptError('Missing --job-id');\n if (!fields.confirmWrite) throw new GenerationReceiptError('Generation import requires --confirm-write');\n const database = lineageDb();\n let job: GenerationJob;\n try {\n job = loadGenerationJob(database, project, fields.jobId);\n } finally {\n database.close();\n }\n if (job.status !== 'planned') throw new GenerationReceiptError(`Generation job is not importable from status: ${job.status}`);\n if (job.source_mode !== 'lineage_reroll') throw new GenerationReceiptError(`Generation job is not a re-roll job: ${job.source_mode}`);\n const target = job.inputs.filter(input => input.role === 'reroll_target');\n if (target.length !== 1) throw new GenerationReceiptError('Re-roll import requires exactly one reroll_target input');\n const resolved = resolveScratchFile(fields.file);\n indexLineageAssets(project);\n const writeDb = lineageDb();\n try {\n const timestamp = nowIso();\n writeDb.exec('BEGIN IMMEDIATE');\n try {\n const assetRow = writeDb.prepare('select id from assets where project_id = ? and id = ?').get(project, resolved.assetId);\n if (!assetRow) throw new GenerationReceiptError(`Indexed local asset was not found: ${resolved.relativePath}`);\n const outputId = `${fields.jobId}:output:0`;\n writeDb.prepare(`insert into generation_job_outputs (\n id, job_id, project_id, output_index, file_path, checksum_sha256, size_bytes, content_type, imported_asset_id, parent_asset_id, imported_at\n ) values (?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?)`).run(outputId, fields.jobId, project, resolved.relativePath, resolved.checksum, resolved.size, resolved.contentType, resolved.assetId, target[0].asset_id, timestamp);\n writeDb.prepare(`\n update generation_jobs\n set status = 'imported', imported_at = ?, updated_at = ?\n where project_id = ? and id = ?\n `).run(timestamp, timestamp, project, fields.jobId);\n insertReceipt(writeDb, fields.jobId, 'import', 'reroll import', {\n file: { output_index: 0, file_path: resolved.relativePath, imported_asset_id: resolved.assetId, parent_asset_id: target[0].asset_id },\n reroll: { root_asset_id: job.root_asset_id, node_asset_id: target[0].asset_id },\n });\n writeDb.exec('COMMIT');\n } catch (error) {\n writeDb.exec('ROLLBACK');\n throw error;\n }\n recordLineageRerollAttempt(project, {\n rootAssetId: job.root_asset_id,\n nodeAssetId: target[0].asset_id,\n assetId: resolved.assetId,\n prompt: job.prompt,\n generationJobId: fields.jobId,\n filePath: resolved.relativePath,\n checksumSha256: resolved.checksum,\n confirmWrite: true,\n });\n const rerollTask = listLineageTasks(project, job.root_asset_id).tasks.find(task => task.task_type === 'reroll' && task.target_asset_id === target[0].asset_id);\n if (rerollTask) {\n resolveLineageTask(project, {\n actor: 'agent',\n confirmWrite: true,\n resolvedAssetId: resolved.assetId,\n resolvedGenerationJobId: fields.jobId,\n taskId: rerollTask.id,\n });\n }\n const importedJob = loadGenerationJob(writeDb, project, fields.jobId);\n return { ok: true, command: 'reroll import', project, job: importedJob, imported: importedJob.outputs };\n } finally {\n writeDb.close();\n }\n}\n", "import { defaultProject } from './assetCore';\nimport { lineageDb, nowIso } from './assetLineageDb';\nimport { loadGenerationJob } from './generationReceipts';\nimport type { GenerationJobListResponse } from '../shared/types';\n\nexport function listImageGenerationJobs(\n project = defaultProject,\n fields: { assetId?: string; rootAssetId?: string; limit?: number } = {}\n): GenerationJobListResponse {\n const clauses = ['job.project_id = ?'];\n const params: string[] = [project];\n if (fields.rootAssetId) {\n clauses.push('job.root_asset_id = ?');\n params.push(fields.rootAssetId);\n }\n if (fields.assetId) {\n clauses.push('(input.asset_id = ? or output.imported_asset_id = ? or output.parent_asset_id = ?)');\n params.push(fields.assetId, fields.assetId, fields.assetId);\n }\n const limit = Math.max(1, Math.min(50, Number.isInteger(fields.limit) ? Number(fields.limit) : 12));\n const database = lineageDb();\n try {\n const rows = database.prepare(`\n select distinct job.id\n from generation_jobs job\n left join generation_job_inputs input on input.job_id = job.id\n left join generation_job_outputs output on output.job_id = job.id\n where ${clauses.join(' and ')}\n order by job.created_at desc, job.id desc\n limit ?\n `).all(...params, limit) as Array<{ id: string }>;\n return { ok: true, command: 'generate image jobs', project, jobs: rows.map(row => loadGenerationJob(database, project, row.id)), fetchedAt: nowIso() };\n } finally {\n database.close();\n }\n}\n", "import type express from 'express';\nimport {\n addLineageTaskComment,\n cancelLineageTask,\n claimLineageTask,\n getLineageTask,\n listLineageTasks,\n overrideLineageTask,\n startLineageTask,\n updateLineageTaskInstructions,\n} from './assetLineageTasks';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nfunction stringBody(req: express.Request, key: string): string | undefined {\n const value = (req.body as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction boolBody(req: express.Request, key: string): boolean {\n return (req.body as Record<string, unknown>)[key] === true;\n}\n\nexport function registerLineageTaskRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/lineage/:rootAssetId/tasks', asyncRoute((req, res) => {\n res.json(listLineageTasks(projectFrom(req), req.params.rootAssetId));\n }));\n\n app.get('/api/lineage/tasks/:taskId', asyncRoute((req, res) => {\n res.json(getLineageTask(projectFrom(req), req.params.taskId));\n }));\n\n app.post('/api/lineage/tasks/:taskId/instructions', asyncRoute((req, res) => {\n res.json(updateLineageTaskInstructions(projectFrom(req), {\n instructions: stringBody(req, 'instructions') || '',\n taskId: req.params.taskId,\n }));\n }));\n\n app.post('/api/lineage/tasks/:taskId/comment', asyncRoute((req, res) => {\n res.json(addLineageTaskComment(projectFrom(req), {\n actor: stringBody(req, 'actor') || '',\n message: stringBody(req, 'message') || stringBody(req, 'comment') || '',\n taskId: req.params.taskId,\n }));\n }));\n\n app.post('/api/lineage/tasks/:taskId/claim', asyncRoute((req, res) => {\n res.json(claimLineageTask(projectFrom(req), {\n agentName: stringBody(req, 'agentName') || stringBody(req, 'agent_name') || '',\n taskId: req.params.taskId,\n }));\n }));\n\n app.post('/api/lineage/tasks/:taskId/start', asyncRoute((req, res) => {\n res.json(startLineageTask(projectFrom(req), {\n claimToken: stringBody(req, 'claimToken') || stringBody(req, 'claim_token') || '',\n taskId: req.params.taskId,\n }));\n }));\n\n app.post('/api/lineage/tasks/:taskId/cancel', asyncRoute((req, res) => {\n res.json(cancelLineageTask(projectFrom(req), {\n actor: stringBody(req, 'actor') || '',\n confirmWrite: boolBody(req, 'confirmWrite') || boolBody(req, 'confirm_write'),\n override: boolBody(req, 'override'),\n taskId: req.params.taskId,\n }));\n }));\n\n app.post('/api/lineage/tasks/:taskId/override', asyncRoute((req, res) => {\n res.json(overrideLineageTask(projectFrom(req), {\n actor: stringBody(req, 'actor') || '',\n instructions: stringBody(req, 'instructions'),\n reason: stringBody(req, 'reason') || '',\n taskId: req.params.taskId,\n }));\n }));\n}\n", "import { createHash } from 'node:crypto';\nimport { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, posix } from 'node:path';\nimport { gunzipSync } from 'node:zlib';\nimport { defaultProject, repoRoot } from './assetCore';\nimport { linkLineageAssets, updateLineageLayout, updateSelectedAsset } from './assetLineage';\nimport { lineageDb, nowIso } from './assetLineageDb';\nimport { archiveLineageWorkspace, createLineageWorkspace, isLineageWorkspaceError, lineageWorkspaceId } from './assetLineageWorkspaces';\nimport { fileSha256 } from './localReview';\n\nconst demoWorkspaceTitle = 'Demo: Content iteration tree';\nconst demoWorkspaceNotes = 'Repeatable sample lineage for demos and onboarding. Archive it when reviewing real work.';\nconst demoBasePath = ['lineage-demo', '2026-06-lineage-demo'];\nconst swissifierManifestPath = join(repoRoot, 'fixtures', defaultProject, 'lineage', 'swissifier-rich-demo.json');\n\ninterface SwissifierManifestAsset {\n asset_id: string;\n file: string;\n title: string;\n channel: string;\n status: string;\n checksum_sha256: string;\n size_bytes: number;\n content_type: string;\n position: { x: number; y: number };\n}\n\ninterface SwissifierManifestRerollAttempt {\n node_asset_id: string;\n file: string;\n title: string;\n prompt: string;\n generation_job_id: string;\n checksum_sha256: string;\n size_bytes: number;\n content_type: string;\n attempt_index: number;\n current?: boolean;\n}\n\ninterface SwissifierManifest {\n id: string;\n title: string;\n notes: string;\n campaign: string;\n audience: string;\n media: {\n target_dir: string;\n source_env: string;\n source_hint: string;\n download?: { file: string; url: string; sha256: string; size_bytes: number };\n };\n root_asset_id: string;\n selected_asset_ids: string[];\n assets: SwissifierManifestAsset[];\n edges: Array<{ parent: string; child: string }>;\n reroll_attempts?: SwissifierManifestRerollAttempt[];\n}\n\nconst demoAssets = [\n { key: 'root', channel: 'linkedin', file: 'demo-root.svg', label: 'Initial Demo Concept', fill: '#f6fbfb', stroke: '#0b7f88' },\n { key: 'hookA', channel: 'tiktok', file: 'demo-hook-a-v01.svg', label: 'Hook A v01', fill: '#fff8e6', stroke: '#9a6a00' },\n { key: 'hookB', channel: 'linkedin', file: 'demo-workflow-v01.svg', label: 'Workflow v01', fill: '#eff7ff', stroke: '#2166a5' },\n { key: 'hookC', channel: 'linkedin', file: 'demo-founder-note-v01.svg', label: 'Founder Note v01', fill: '#f6efff', stroke: '#7653a6' },\n { key: 'hookA2', channel: 'tiktok', file: 'demo-hook-a-v02.svg', label: 'Hook A v02', fill: '#fff2cc', stroke: '#9a6a00' },\n { key: 'hookA3', channel: 'tiktok', file: 'demo-before-after-v02.svg', label: 'Before / After v02', fill: '#fff2cc', stroke: '#9a6a00' },\n { key: 'hookB2', channel: 'linkedin', file: 'demo-workflow-v02.svg', label: 'Workflow v02', fill: '#e6f3ff', stroke: '#2166a5' },\n { key: 'hookB3', channel: 'linkedin', file: 'demo-product-v02.svg', label: 'Product v02', fill: '#e6f3ff', stroke: '#2166a5' },\n { key: 'winner', channel: 'linkedin', file: 'demo-product-v03.svg', label: 'Selected Product v03', fill: '#eaf8ef', stroke: '#2e7d4f' },\n { key: 'alt', channel: 'tiktok', file: 'demo-action-v03.svg', label: 'Action v03', fill: '#fff2cc', stroke: '#9a6a00' },\n] as const;\n\nconst demoEdges = [\n ['root', 'hookA'],\n ['root', 'hookB'],\n ['root', 'hookC'],\n ['hookA', 'hookA2'],\n ['hookA', 'hookA3'],\n ['hookB', 'hookB2'],\n ['hookB', 'hookB3'],\n ['hookB3', 'winner'],\n ['hookA3', 'alt'],\n] as const;\n\nconst demoPositions = new Map<string, { x: number; y: number }>([\n ['root', { x: 0, y: 160 }],\n ['hookA', { x: 340, y: 0 }],\n ['hookB', { x: 340, y: 190 }],\n ['hookC', { x: 340, y: 380 }],\n ['hookA2', { x: 700, y: -80 }],\n ['hookA3', { x: 700, y: 80 }],\n ['hookB2', { x: 700, y: 230 }],\n ['hookB3', { x: 700, y: 390 }],\n ['winner', { x: 1060, y: 350 }],\n ['alt', { x: 1060, y: 80 }],\n]);\n\nfunction demoProjectDir(project: string): string {\n return join(repoRoot, '.asset-scratch', ...demoBasePath, project);\n}\n\nfunction demoRelativePath(project: string, asset: typeof demoAssets[number]): string {\n return join(...demoBasePath, project, asset.channel, asset.file);\n}\n\nfunction demoFilePath(project: string, asset: typeof demoAssets[number]): string {\n return join(demoProjectDir(project), asset.channel, asset.file);\n}\n\nfunction swissifierManifest(): SwissifierManifest {\n return JSON.parse(readFileSync(swissifierManifestPath, 'utf8')) as SwissifierManifest;\n}\n\nfunction swissifierRelativePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset): string {\n return join(manifest.media.target_dir, asset.file);\n}\n\nfunction swissifierFilePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset): string {\n return join(repoRoot, '.asset-scratch', swissifierRelativePath(manifest, asset));\n}\n\nfunction swissifierRerollRelativePath(manifest: SwissifierManifest, attempt: SwissifierManifestRerollAttempt): string {\n return join(manifest.media.target_dir, 'reroll-attempts', attempt.file);\n}\n\nfunction swissifierRerollFilePath(manifest: SwissifierManifest, attempt: SwissifierManifestRerollAttempt): string {\n return join(repoRoot, '.asset-scratch', swissifierRerollRelativePath(manifest, attempt));\n}\n\nfunction swissifierRerollFixturePath(attempt: SwissifierManifestRerollAttempt): string {\n return join(dirname(swissifierManifestPath), 'swissifier-rerolls', attempt.file);\n}\n\nfunction swissifierSourcePath(manifest: SwissifierManifest, asset: SwissifierManifestAsset, sourceDir: string): string | null {\n const direct = join(sourceDir, asset.file);\n if (existsSync(direct)) return direct;\n const nested = join(sourceDir, manifest.media.target_dir, asset.file);\n return existsSync(nested) ? nested : null;\n}\n\nfunction swissifierMediaState(manifest: SwissifierManifest) {\n const missing: string[] = [];\n const invalid: string[] = [];\n for (const asset of manifest.assets) {\n const relativePath = swissifierRelativePath(manifest, asset);\n const path = swissifierFilePath(manifest, asset);\n if (!existsSync(path)) {\n missing.push(relativePath);\n continue;\n }\n if (fileSha256(path) !== asset.checksum_sha256) invalid.push(relativePath);\n }\n return { invalid, missing };\n}\n\nfunction sha256Hex(input: Buffer | string): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nfunction safeTarEntryName(rawName: string): string {\n const stripped = rawName.replace(/\\0.*$/, '').replace(/^\\.\\//, '');\n if (!stripped || stripped === '.') return '';\n if (stripped.includes('\\\\') || stripped.startsWith('/') || /^[A-Za-z]:/.test(stripped)) {\n throw new Error(`Unsafe Swissifier media archive path: ${rawName}`);\n }\n const normalized = posix.normalize(stripped);\n if (!normalized || normalized === '.' || normalized.startsWith('../') || normalized === '..') {\n throw new Error(`Unsafe Swissifier media archive path: ${rawName}`);\n }\n return normalized;\n}\n\nfunction tarOctal(header: Buffer, start: number, length: number): number {\n const raw = header.toString('utf8', start, start + length).replace(/\\0.*$/, '').trim();\n if (!raw) return 0;\n if (!/^[0-7]+$/.test(raw)) throw new Error(`Invalid Swissifier media archive size: ${raw}`);\n return Number.parseInt(raw, 8);\n}\n\nfunction tarName(header: Buffer): string {\n const name = header.toString('utf8', 0, 100).replace(/\\0.*$/, '');\n const prefix = header.toString('utf8', 345, 500).replace(/\\0.*$/, '');\n return prefix ? `${prefix}/${name}` : name;\n}\n\nfunction isAppleDoubleEntry(name: string): boolean {\n return name === '._.' || name.startsWith('._') || name.includes('/._');\n}\n\nfunction extractSwissifierMediaArchive(archive: Buffer, manifest: SwissifierManifest, destination: string) {\n const expected = new Map(manifest.assets.map(asset => [asset.file, asset]));\n const extracted = new Set<string>();\n const body = gunzipSync(archive);\n let offset = 0;\n while (offset + 512 <= body.length) {\n const header = body.subarray(offset, offset + 512);\n offset += 512;\n if (header.every(byte => byte === 0)) break;\n const typeflag = header.toString('utf8', 156, 157);\n const rawName = tarName(header);\n const name = safeTarEntryName(rawName);\n const size = tarOctal(header, 124, 12);\n const nextOffset = offset + Math.ceil(size / 512) * 512;\n if (nextOffset > body.length) throw new Error(`Truncated Swissifier media archive entry: ${rawName}`);\n if (!name || typeflag === '5') {\n offset = nextOffset;\n continue;\n }\n if (typeflag === 'x' || typeflag === 'g') {\n offset = nextOffset;\n continue;\n }\n if (isAppleDoubleEntry(name)) {\n offset = nextOffset;\n continue;\n }\n if (typeflag && typeflag !== '0') throw new Error(`Unsupported Swissifier media archive entry type for ${name}`);\n const directName = name.startsWith(`${manifest.media.target_dir}/`) ? name.slice(manifest.media.target_dir.length + 1) : name;\n const asset = expected.get(directName);\n if (!asset) throw new Error(`Unexpected Swissifier media archive entry: ${name}`);\n if (size !== asset.size_bytes) throw new Error(`Unexpected Swissifier media archive size for ${name}`);\n const file = body.subarray(offset, offset + size);\n const actualSha = sha256Hex(file);\n if (actualSha !== asset.checksum_sha256) throw new Error(`Checksum mismatch for Swissifier media archive entry: ${name}`);\n const target = join(destination, directName);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, file);\n extracted.add(directName);\n offset = nextOffset;\n }\n const missing = manifest.assets.map(asset => asset.file).filter(file => !extracted.has(file));\n if (missing.length) throw new Error(`Swissifier media archive missing ${missing.length} expected file${missing.length === 1 ? '' : 's'}`);\n return { extracted: extracted.size };\n}\n\nasync function downloadBuffer(url: string, maxBytes: number): Promise<Buffer> {\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Swissifier media download failed with HTTP ${response.status}`);\n const contentLength = Number(response.headers.get('content-length') || 0);\n if (contentLength > maxBytes) throw new Error(`Swissifier media download is too large: ${contentLength} bytes`);\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxBytes) throw new Error(`Swissifier media download is too large: ${buffer.length} bytes`);\n return buffer;\n}\n\nfunction missingDemoMedia(project: string): string[] {\n return demoAssets\n .filter(asset => !existsSync(demoFilePath(project, asset)))\n .map(asset => demoRelativePath(project, asset));\n}\n\nexport function demoSeedMediaStatus(project = defaultProject) {\n const missing = missingDemoMedia(project);\n const present = demoAssets.length - missing.length;\n return {\n ok: true,\n media_root: join(repoRoot, '.asset-scratch'),\n present,\n total: demoAssets.length,\n missing,\n fixture_present: present,\n fixture_total: demoAssets.length,\n fixture_missing: missing,\n };\n}\n\nexport function swissifierRichDemoMediaStatus(project = defaultProject) {\n const manifest = swissifierManifest();\n const { invalid, missing } = swissifierMediaState(manifest);\n const present = manifest.assets.length - missing.length - invalid.length;\n return {\n ok: true,\n demo_id: manifest.id,\n project,\n media_root: join(repoRoot, '.asset-scratch'),\n media_target: manifest.media.target_dir,\n download_available: Boolean(manifest.media.download),\n download_file: manifest.media.download?.file,\n download_sha256: manifest.media.download?.sha256,\n download_url: manifest.media.download?.url,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n present,\n total: manifest.assets.length,\n missing,\n invalid,\n fixture_present: present,\n fixture_total: manifest.assets.length,\n fixture_missing: [...missing, ...invalid],\n };\n}\n\nexport async function downloadSwissifierRichDemoMedia(project = defaultProject, fields: { confirmWrite: boolean; sourceUrl?: string; expectedSha256?: string } = { confirmWrite: false }) {\n const manifest = swissifierManifest();\n const download = manifest.media.download;\n if (!download) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n download_available: false,\n restored: 0,\n total: manifest.assets.length,\n };\n }\n const sourceUrl = fields.sourceUrl || download.url;\n const expectedSha256 = fields.expectedSha256 || download.sha256;\n const maxBytes = Math.max(download.size_bytes + 1024 * 1024, download.size_bytes * 1.1);\n const archive = await downloadBuffer(sourceUrl, maxBytes);\n const archiveSha256 = sha256Hex(archive);\n if (archiveSha256 !== expectedSha256) throw new Error(`Swissifier media download checksum mismatch: expected ${expectedSha256}, got ${archiveSha256}`);\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: true as const,\n download_available: true,\n download_file: download.file,\n download_url: sourceUrl,\n archive_sha256: archiveSha256,\n restored: 0,\n total: manifest.assets.length,\n would_restore: manifest.assets.length,\n };\n }\n const sourceDir = mkdtempSync(join(tmpdir(), 'lineage-swissifier-media-'));\n try {\n const extracted = extractSwissifierMediaArchive(archive, manifest, sourceDir);\n const restored = restoreSwissifierRichDemoMedia(project, { confirmWrite: true, sourceDir });\n return {\n ...restored,\n download_available: true,\n download_file: download.file,\n download_url: sourceUrl,\n archive_sha256: archiveSha256,\n extracted: extracted.extracted,\n media_status: swissifierRichDemoMediaStatus(project),\n };\n } finally {\n rmSync(sourceDir, { force: true, recursive: true });\n }\n}\n\nexport function restoreDemoSeedMedia(project = defaultProject, fields: { confirmWrite: boolean } = { confirmWrite: false }) {\n const missing = new Set(missingDemoMedia(project));\n if (fields.confirmWrite) {\n for (const asset of demoAssets) {\n if (missing.has(demoRelativePath(project, asset))) writeDemoFile(project, asset);\n }\n }\n return {\n ok: true as const,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: fields.confirmWrite ? missing.size : 0,\n total: demoAssets.length,\n would_restore: fields.confirmWrite ? 0 : missing.size,\n missing: Array.from(missing),\n };\n}\n\nexport function restoreSwissifierRichDemoMedia(project = defaultProject, fields: { confirmWrite: boolean; sourceDir?: string } = { confirmWrite: false }) {\n const manifest = swissifierManifest();\n const before = swissifierMediaState(manifest);\n const sourceDir = fields.sourceDir || process.env[manifest.media.source_env];\n if (!sourceDir) {\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: 0,\n total: manifest.assets.length,\n would_restore: 0,\n source_required: true,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n missing: before.missing,\n invalid: before.invalid,\n unavailable: [...before.missing, ...before.invalid],\n };\n }\n const unavailable: string[] = [];\n const copyable: Array<{ asset: SwissifierManifestAsset; source: string }> = [];\n const wanted = new Set([...before.missing, ...before.invalid]);\n for (const asset of manifest.assets) {\n const relativePath = swissifierRelativePath(manifest, asset);\n if (!wanted.has(relativePath)) continue;\n const source = swissifierSourcePath(manifest, asset, sourceDir);\n if (!source || fileSha256(source) !== asset.checksum_sha256) {\n unavailable.push(relativePath);\n continue;\n }\n copyable.push({ asset, source });\n }\n if (fields.confirmWrite) {\n for (const item of copyable) {\n const target = swissifierFilePath(manifest, item.asset);\n mkdirSync(dirname(target), { recursive: true });\n copyFileSync(item.source, target);\n }\n }\n return {\n ok: true as const,\n demo_id: manifest.id,\n project,\n dryRun: !fields.confirmWrite,\n media_root: join(repoRoot, '.asset-scratch'),\n restored: fields.confirmWrite ? copyable.length : 0,\n total: manifest.assets.length,\n would_restore: fields.confirmWrite ? 0 : copyable.length,\n source_required: false,\n source_env: manifest.media.source_env,\n source_hint: manifest.media.source_hint,\n missing: before.missing,\n invalid: before.invalid,\n unavailable,\n };\n}\n\nfunction svg(label: string, fill: string, stroke: string): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1200\" height=\"675\" viewBox=\"0 0 1200 675\">\n <rect width=\"1200\" height=\"675\" rx=\"42\" fill=\"${fill}\"/>\n <rect x=\"60\" y=\"60\" width=\"1080\" height=\"555\" rx=\"34\" fill=\"#ffffff\" stroke=\"${stroke}\" stroke-width=\"12\"/>\n <text x=\"600\" y=\"310\" text-anchor=\"middle\" font-family=\"Inter, Arial, sans-serif\" font-size=\"68\" font-weight=\"800\" fill=\"#1f2a33\">${label}</text>\n <text x=\"600\" y=\"390\" text-anchor=\"middle\" font-family=\"Inter, Arial, sans-serif\" font-size=\"34\" font-weight=\"700\" fill=\"${stroke}\">Lineage demo lineage</text>\n</svg>\n`;\n}\n\nfunction assetIdFor(asset: typeof demoAssets[number]): string {\n return `local-${createHash('sha256').update(svg(asset.label, asset.fill, asset.stroke)).digest('hex').slice(0, 12)}`;\n}\n\nfunction demoAssetIds(): Record<string, string> {\n return Object.fromEntries(demoAssets.map(asset => [asset.key, assetIdFor(asset)]));\n}\n\nfunction writeDemoFile(project: string, asset: typeof demoAssets[number]): void {\n const path = demoFilePath(project, asset);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, svg(asset.label, asset.fill, asset.stroke));\n}\n\nfunction writeDemoFiles(project: string): Record<string, string> {\n const ids = demoAssetIds();\n for (const asset of demoAssets) writeDemoFile(project, asset);\n return ids;\n}\n\nfunction swissifierRerollAsset(attempt: SwissifierManifestRerollAttempt) {\n const source = swissifierRerollFixturePath(attempt);\n if (!existsSync(source)) throw new Error(`Missing Swissifier re-roll fixture media: ${attempt.file}`);\n const body = readFileSync(source);\n if (body.length !== attempt.size_bytes) throw new Error(`Unexpected Swissifier re-roll fixture size for ${attempt.file}`);\n const checksumSha256 = sha256Hex(body);\n if (checksumSha256 !== attempt.checksum_sha256) throw new Error(`Checksum mismatch for Swissifier re-roll fixture: ${attempt.file}`);\n return {\n assetId: `local-${checksumSha256.slice(0, 12)}`,\n checksumSha256,\n sizeBytes: body.length,\n };\n}\n\nfunction writeSwissifierRerollFiles(manifest: SwissifierManifest) {\n for (const attempt of manifest.reroll_attempts || []) {\n swissifierRerollAsset(attempt);\n const target = swissifierRerollFilePath(manifest, attempt);\n mkdirSync(dirname(target), { recursive: true });\n copyFileSync(swissifierRerollFixturePath(attempt), target);\n }\n}\n\nfunction upsertDemoAssets(project: string, ids: Record<string, string>) {\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n const assetStatement = database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, 'local', ?, null, ?, 'image', ?, 'planned', ?, '2026-06-lineage-demo', 'demo', ?, 'image/svg+xml', ?, ?, ?)\n on conflict(id) do update set\n project_id = excluded.project_id, source = excluded.source, local_path = excluded.local_path, checksum_sha256 = excluded.checksum_sha256,\n media_type = excluded.media_type, title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `);\n const reviewStatement = database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `);\n for (const asset of demoAssets) {\n const body = svg(asset.label, asset.fill, asset.stroke);\n assetStatement.run(\n ids[asset.key],\n project,\n demoRelativePath(project, asset),\n createHash('sha256').update(body).digest('hex'),\n asset.label,\n asset.channel,\n Buffer.byteLength(body),\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(ids[asset.key], timestamp);\n }\n } finally {\n database.close();\n }\n return { catalog: 0, local: demoAssets.length, total: demoAssets.length };\n}\n\nfunction upsertSwissifierAssets(project: string, manifest: SwissifierManifest) {\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.prepare(`\n insert into projects (id, product, catalog_path, created_at, updated_at)\n values (?, ?, ?, ?, ?)\n on conflict(id) do update set product = excluded.product, updated_at = excluded.updated_at\n `).run(project, project, join(repoRoot, project, 'assets', 'catalog.json'), timestamp, timestamp);\n const assetStatement = database.prepare(`\n insert into assets (\n id, project_id, source, local_path, s3_key, checksum_sha256, media_type, title, status,\n channel, campaign, audience, size_bytes, content_type, created_at, updated_at, last_seen_at\n ) values (?, ?, 'local', ?, null, ?, 'image', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n project_id = excluded.project_id, source = excluded.source, local_path = excluded.local_path, checksum_sha256 = excluded.checksum_sha256,\n media_type = excluded.media_type, title = excluded.title, status = excluded.status, channel = excluded.channel,\n campaign = excluded.campaign, audience = excluded.audience, size_bytes = excluded.size_bytes,\n content_type = excluded.content_type, updated_at = excluded.updated_at, last_seen_at = excluded.last_seen_at\n `);\n const reviewStatement = database.prepare(`\n insert into asset_reviews (asset_id, review_state, updated_at)\n values (?, 'unreviewed', ?)\n on conflict(asset_id) do nothing\n `);\n for (const asset of manifest.assets) {\n assetStatement.run(\n asset.asset_id,\n project,\n swissifierRelativePath(manifest, asset),\n asset.checksum_sha256,\n asset.title,\n asset.status,\n asset.channel,\n manifest.campaign,\n manifest.audience,\n asset.size_bytes,\n asset.content_type,\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(asset.asset_id, timestamp);\n }\n for (const attempt of manifest.reroll_attempts || []) {\n const generated = swissifierRerollAsset(attempt);\n assetStatement.run(\n generated.assetId,\n project,\n swissifierRerollRelativePath(manifest, attempt),\n generated.checksumSha256,\n attempt.title,\n 'planned',\n 'local',\n manifest.campaign,\n manifest.audience,\n generated.sizeBytes,\n attempt.content_type,\n timestamp,\n timestamp,\n timestamp\n );\n reviewStatement.run(generated.assetId, timestamp);\n }\n } finally {\n database.close();\n }\n const attemptCount = manifest.reroll_attempts?.length || 0;\n return { catalog: 0, local: manifest.assets.length + attemptCount, total: manifest.assets.length + attemptCount };\n}\n\nfunction upsertSwissifierRerollAttempts(project: string, manifest: SwissifierManifest) {\n const attempts = manifest.reroll_attempts || [];\n if (attempts.length === 0) return { total: 0 };\n const database = lineageDb();\n const timestamp = nowIso();\n try {\n database.exec('BEGIN IMMEDIATE');\n try {\n const nodes = new Set(attempts.map(attempt => attempt.node_asset_id));\n for (const nodeAssetId of nodes) {\n database.prepare('update asset_attempts set is_current = 0 where project_id = ? and node_asset_id = ?').run(project, nodeAssetId);\n }\n const statement = database.prepare(`\n insert into asset_attempts (\n id, project_id, node_asset_id, asset_id, attempt_index, source, prompt, generation_job_id,\n file_path, checksum_sha256, created_at, promoted_at, is_current\n ) values (?, ?, ?, ?, ?, 'reroll', ?, ?, ?, ?, ?, ?, ?)\n on conflict(id) do update set\n asset_id = excluded.asset_id,\n source = excluded.source,\n prompt = excluded.prompt,\n generation_job_id = excluded.generation_job_id,\n file_path = excluded.file_path,\n checksum_sha256 = excluded.checksum_sha256,\n promoted_at = excluded.promoted_at,\n is_current = excluded.is_current\n `);\n for (const attempt of attempts) {\n const generated = swissifierRerollAsset(attempt);\n statement.run(\n `${project}:${attempt.node_asset_id}:attempt:${attempt.attempt_index}`,\n project,\n attempt.node_asset_id,\n generated.assetId,\n attempt.attempt_index,\n attempt.prompt,\n attempt.generation_job_id,\n swissifierRerollRelativePath(manifest, attempt),\n generated.checksumSha256,\n timestamp,\n timestamp,\n attempt.current ? 1 : 0\n );\n }\n for (const nodeAssetId of nodes) {\n const currentCount = database.prepare('select count(*) count from asset_attempts where project_id = ? and node_asset_id = ? and is_current = 1').get(project, nodeAssetId) as { count: number };\n if (currentCount.count === 0) {\n database.prepare(`\n update asset_attempts\n set is_current = 1, promoted_at = ?\n where id = (\n select id from asset_attempts\n where project_id = ? and node_asset_id = ?\n order by attempt_index desc\n limit 1\n )\n `).run(timestamp, project, nodeAssetId);\n }\n }\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n } finally {\n database.close();\n }\n return { total: attempts.length };\n}\n\nexport function seedDemoLineageWorkspace(project: string, fields: { activate?: boolean; confirmWrite: boolean }) {\n const ids = fields.confirmWrite ? writeDemoFiles(project) : demoAssetIds();\n const rootAssetId = ids.root;\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n root_asset_id: rootAssetId,\n workspace_id: lineageWorkspaceId(project, rootAssetId),\n files_dir: demoProjectDir(project),\n };\n }\n const summary = upsertDemoAssets(project, ids);\n for (const [parent, child] of demoEdges) {\n linkLineageAssets(project, { parentAssetId: ids[parent], childAssetId: ids[child], confirmWrite: true });\n }\n updateSelectedAsset(project, {\n assetId: ids.winner,\n confirmWrite: true,\n notes: 'Demo selected winner for the next variation.',\n rootAssetId,\n });\n updateLineageLayout(project, {\n confirmWrite: true,\n rootAssetId,\n positions: [...demoPositions].map(([key, position]) => ({ assetId: ids[key], ...position })),\n });\n const workspace = createLineageWorkspace(project, {\n activate: fields.activate !== false,\n confirmWrite: true,\n createdBy: 'system',\n notes: demoWorkspaceNotes,\n rootAssetId,\n title: demoWorkspaceTitle,\n }).workspace;\n return {\n ok: true as const,\n message: `Seeded ${demoWorkspaceTitle}`,\n files_dir: demoProjectDir(project),\n root_asset_id: rootAssetId,\n selected_asset_id: ids.winner,\n summary,\n workspace,\n };\n}\n\nexport function seedSwissifierRichDemoWorkspace(project: string, fields: { activate?: boolean; confirmWrite: boolean }) {\n const manifest = swissifierManifest();\n if (!fields.confirmWrite) {\n return {\n ok: true as const,\n dryRun: true as const,\n demo_id: manifest.id,\n root_asset_id: manifest.root_asset_id,\n workspace_id: lineageWorkspaceId(project, manifest.root_asset_id),\n media_status: swissifierRichDemoMediaStatus(project),\n };\n }\n writeSwissifierRerollFiles(manifest);\n const summary = upsertSwissifierAssets(project, manifest);\n for (const edge of manifest.edges) {\n linkLineageAssets(project, { parentAssetId: edge.parent, childAssetId: edge.child, confirmWrite: true });\n }\n const reroll_attempts = upsertSwissifierRerollAttempts(project, manifest);\n updateSelectedAsset(project, {\n assetIds: manifest.selected_asset_ids,\n confirmWrite: true,\n maxSelections: manifest.selected_asset_ids.length,\n notes: 'Swissifier rich demo bases selected for the next variation.',\n rootAssetId: manifest.root_asset_id,\n });\n updateLineageLayout(project, {\n confirmWrite: true,\n rootAssetId: manifest.root_asset_id,\n positions: manifest.assets.map(asset => ({ assetId: asset.asset_id, ...asset.position })),\n });\n const workspace = createLineageWorkspace(project, {\n activate: fields.activate !== false,\n confirmWrite: true,\n createdBy: 'system',\n notes: manifest.notes,\n rootAssetId: manifest.root_asset_id,\n title: manifest.title,\n }).workspace;\n return {\n ok: true as const,\n message: `Seeded ${manifest.title}`,\n demo_id: manifest.id,\n media_status: swissifierRichDemoMediaStatus(project),\n root_asset_id: manifest.root_asset_id,\n selected_asset_ids: manifest.selected_asset_ids,\n reroll_attempts,\n summary,\n workspace,\n };\n}\n\nexport function archiveDemoLineageWorkspace(project: string, confirmWrite: boolean) {\n const ids = demoAssetIds();\n const rootAssetId = ids.root;\n let archived;\n try {\n archived = archiveLineageWorkspace(project, lineageWorkspaceId(project, rootAssetId), confirmWrite);\n } catch (error) {\n if (!isLineageWorkspaceError(error) || error.status !== 404) throw error;\n archived = { ok: true as const, message: 'No demo lineage workspace exists yet', workspace: null };\n }\n if (confirmWrite) rmSync(demoProjectDir(project), { force: true, recursive: true });\n return {\n ok: true as const,\n message: confirmWrite ? `Archived ${demoWorkspaceTitle}` : `Would archive ${demoWorkspaceTitle}`,\n files_dir: demoProjectDir(project),\n root_asset_id: rootAssetId,\n archived,\n };\n}\n", "import type express from 'express';\nimport {\n indexLineageAssets,\n} from './assetLineage';\nimport {\n activateLineageWorkspace,\n archiveLineageWorkspace,\n createLineageWorkspace,\n inspectLineageWorkspace,\n listLineageWorkspaces,\n updateLineageWorkspace,\n} from './assetLineageWorkspaces';\nimport {\n archiveDemoLineageWorkspace,\n demoSeedMediaStatus,\n downloadSwissifierRichDemoMedia,\n restoreDemoSeedMedia,\n restoreSwissifierRichDemoMedia,\n seedDemoLineageWorkspace,\n seedSwissifierRichDemoWorkspace,\n swissifierRichDemoMediaStatus,\n} from './assetLineageDemo';\n\ntype ProjectFrom = (input: { body?: Record<string, unknown>; query?: Record<string, unknown> }) => string;\ntype AsyncRoute = (handler: (req: express.Request, res: express.Response) => Promise<void> | void) => express.RequestHandler;\n\nexport function registerLineageWorkspaceRoutes(app: express.Express, projectFrom: ProjectFrom, asyncRoute: AsyncRoute): void {\n app.get('/api/lineage-workspaces', asyncRoute((req, res) => {\n res.json(listLineageWorkspaces(projectFrom(req)));\n }));\n\n app.post('/api/lineage-workspaces', asyncRoute((req, res) => {\n const project = projectFrom(req);\n if (req.body.confirmWrite === true) indexLineageAssets(project);\n res.json(createLineageWorkspace(project, {\n rootAssetId: String(req.body.rootAssetId || ''),\n title: typeof req.body.title === 'string' ? req.body.title : undefined,\n status: req.body.status === 'paused' || req.body.status === 'archived' ? req.body.status : 'active',\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n createdBy: req.body.createdBy === 'agent' || req.body.createdBy === 'system' ? req.body.createdBy : 'human',\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/demo/seed', asyncRoute((req, res) => {\n res.json(seedDemoLineageWorkspace(projectFrom(req), {\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/demo/archive', asyncRoute((req, res) => {\n res.json(archiveDemoLineageWorkspace(projectFrom(req), req.body.confirmWrite === true));\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/seed', asyncRoute((req, res) => {\n res.json(seedSwissifierRichDemoWorkspace(projectFrom(req), {\n activate: req.body.activate !== false,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.get('/api/lineage-workspaces/demo/media', asyncRoute((req, res) => {\n res.json({ ok: true, status: demoSeedMediaStatus(projectFrom(req)) });\n }));\n\n app.get('/api/lineage-workspaces/demo/swissifier/media', asyncRoute((req, res) => {\n res.json({ ok: true, status: swissifierRichDemoMediaStatus(projectFrom(req)) });\n }));\n\n app.post('/api/lineage-workspaces/demo/media/restore', asyncRoute((req, res) => {\n res.json({ ok: true, result: restoreDemoSeedMedia(projectFrom(req), { confirmWrite: req.body.confirmWrite === true }) });\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/media/restore', asyncRoute((req, res) => {\n res.json({\n ok: true,\n result: restoreSwissifierRichDemoMedia(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n sourceDir: typeof req.body.sourceDir === 'string' ? req.body.sourceDir : undefined,\n }),\n });\n }));\n\n app.post('/api/lineage-workspaces/demo/swissifier/media/download', asyncRoute(async (req, res) => {\n res.json({\n ok: true,\n result: await downloadSwissifierRichDemoMedia(projectFrom(req), {\n confirmWrite: req.body.confirmWrite === true,\n }),\n });\n }));\n\n app.get('/api/lineage-workspaces/:workspaceId', asyncRoute((req, res) => {\n res.json({\n ok: true,\n project: projectFrom(req),\n workspace: inspectLineageWorkspace(projectFrom(req), req.params.workspaceId),\n });\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId', asyncRoute((req, res) => {\n res.json(updateLineageWorkspace(projectFrom(req), req.params.workspaceId, {\n title: typeof req.body.title === 'string' ? req.body.title : undefined,\n status: req.body.status === 'active' || req.body.status === 'paused' || req.body.status === 'archived' ? req.body.status : undefined,\n notes: typeof req.body.notes === 'string' ? req.body.notes : undefined,\n activate: req.body.activate === true,\n confirmWrite: req.body.confirmWrite === true,\n }));\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId/activate', asyncRoute((req, res) => {\n res.json(activateLineageWorkspace(projectFrom(req), req.params.workspaceId, req.body.confirmWrite === true));\n }));\n\n app.post('/api/lineage-workspaces/:workspaceId/archive', asyncRoute((req, res) => {\n res.json(archiveLineageWorkspace(projectFrom(req), req.params.workspaceId, req.body.confirmWrite === true));\n }));\n}\n"],
|
|
5
|
+
"mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2Zb;AACD,yBAAuB,QAAQ;AAC/B,qCAAmC,QAAQ;AAC3C,eAAa,UAAU,oBAAoB,SAAS,MAAM;AAC1D,uBAAqB,QAAQ;AAC7B,eAAa,UAAU,wBAAwB,iBAAiB,MAAM;AACtE,eAAa,UAAU,wBAAwB,qBAAqB,MAAM;AAC1E,eAAa,UAAU,wBAAwB,iBAAiB,MAAM;AACtE,eAAa,UAAU,wBAAwB,qBAAqB,MAAM;AAC1E,0BAAwB,QAAQ;AAChC,8BAA4B,QAAQ;AACpC,qCAAmC,QAAQ;AAC3C,SAAO;AACT;AAEO,SAAS,qBAAqB,UAA8B;AACjE,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,GAKb;AACD,QAAM,SAAS,SAAS,QAAQ,qFAAqF,EAAE,IAAI;AAC3H,MAAI,OAAQ;AAEZ,WAAS,KAAK,iBAAiB;AAC/B,MAAI;AACF,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqCb;AACD,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,OAAO,CAAC;AACf,aAAS,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,aAAS,KAAK,UAAU;AACxB,UAAM;AAAA,EACR;AACF;AAEA,SAAS,aAAa,UAAwB,OAAe,QAAgB,YAA0B;AACrG,QAAM,OAAO,SAAS,QAAQ,qBAAqB,KAAK,GAAG,EAAE,IAAI;AACjE,MAAI,CAAC,KAAK,KAAK,SAAO,IAAI,SAAS,MAAM,EAAG,UAAS,KAAK,eAAe,KAAK,eAAe,MAAM,IAAI,UAAU,EAAE;AACrH;AAEA,SAAS,uBAAuB,UAA8B;AAC5D,QAAM,OAAO,SAAS,QAAQ,qCAAqC,EAAE,IAAI;AACzE,MAAI,KAAK,KAAK,SAAO,IAAI,SAAS,UAAU,EAAG;AAC/C,QAAM,cAAc,KAAK,KAAK,SAAO,IAAI,SAAS,OAAO,IAAI,UAAU;AAEvE,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAkBN,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOlB;AACH;AAEA,SAAS,mCAAmC,UAA8B;AACxE,QAAM,UAAU,SAAS,QAAQ,qCAAqC,EAAE,IAAI;AAC5E,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAQ;AACnB,UAAM,UAAU,SAAS,QAAQ,qBAAqB,MAAM,IAAI,GAAG,EAAE,IAAI;AACzE,UAAM,cAAc,QAAQ,IAAI,YAAU,OAAO,IAAI,EAAE,KAAK,GAAG;AAC/D,QAAI,gBAAgB,2BAA4B,UAAS,KAAK,wBAAwB,MAAM,IAAI,EAAE;AAAA,EACpG;AACF;AAEA,SAAS,wBAAwB,UAA8B;AAC7D,QAAM,YAAY,SAAS,QAAQ,+EAA+E,EAAE,IAAI;AACxH,MAAI,WAAW,KAAK,SAAS,gBAAgB,EAAG;AAEhD,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcb;AACH;AAEA,SAAS,4BAA4B,UAA8B;AACjE,QAAM,YAAY,SAAS,QAAQ,8EAA8E,EAAE,IAAI;AACvH,MAAI,WAAW,KAAK,SAAS,gBAAgB,EAAG;AAEhD,WAAS,KAAK,4EAA4E;AAC1F,MAAI;AACF,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA8Bb;AACD,UAAM,aAAa,SAAS,QAAQ,0BAA0B,EAAE,IAAI;AACpE,QAAI,WAAW,SAAS,EAAG,OAAM,IAAI,MAAM,yDAAyD,KAAK,UAAU,UAAU,CAAC,EAAE;AAChI,aAAS,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,aAAS,KAAK,UAAU;AACxB,UAAM;AAAA,EACR,UAAE;AACA,aAAS,KAAK,2DAA2D;AAAA,EAC3E;AACF;AAEA,SAAS,eAAe,UAAwB,OAAuB;AACrE,QAAM,MAAM,SAAS,QAAQ,iEAAiE,EAAE,IAAI,KAAK;AACzG,SAAO,KAAK,OAAO;AACrB;AAEA,SAAS,mCAAmC,UAA8B;AACxE,QAAM,UAAU,eAAe,UAAU,iBAAiB;AAC1D,QAAM,YAAY,eAAe,UAAU,uBAAuB;AAClE,QAAM,qBAAqB,QAAQ,WAAW,CAAC,QAAQ,SAAS,kBAAkB,CAAC;AACnF,QAAM,uBAAuB,QAAQ,aAAa,CAAC,UAAU,SAAS,iBAAiB,CAAC;AACxF,MAAI,CAAC,sBAAsB,CAAC,qBAAsB;AAElD,WAAS,KAAK,4EAA4E;AAC1F,MAAI;AACF,QAAI,mBAAoB,4BAA2B,QAAQ;AAC3D,QAAI,qBAAsB,iCAAgC,QAAQ;AAClE,UAAM,aAAa,SAAS,QAAQ,0BAA0B,EAAE,IAAI;AACpE,QAAI,WAAW,SAAS,EAAG,OAAM,IAAI,MAAM,0DAA0D,KAAK,UAAU,UAAU,CAAC,EAAE;AACjI,aAAS,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,aAAS,KAAK,UAAU;AACxB,UAAM;AAAA,EACR,UAAE;AACA,aAAS,KAAK,2DAA2D;AAAA,EAC3E;AACF;AAEA,SAAS,2BAA2B,UAA8B;AAChE,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4Bb;AACH;AAEA,SAAS,gCAAgC,UAA8B;AACrE,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsBb;AACH;;;AC5pBA,SAAS,cAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAAS,sBAAsB,UAAwB,SAAiB,SAAiB,WAAiC;AACxH,QAAM,WAAW,OAAO;AACxB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYhB,EAAE;AAAA,IACD,GAAG,OAAO,IAAI,OAAO,cAAc,UAAU,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU,gBAAgB;AAAA,IAC1B,UAAU,aAAa;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB,UAAU,SAAS;AAAA,IACnB,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,+BAA+B,UAAwB,SAAiB,OAA0B;AAChH,aAAW,aAAa,MAAM,cAAc,CAAC,EAAG,uBAAsB,UAAU,SAAS,MAAM,UAAU,SAAS;AACpH;AAEO,SAAS,0BAA0B,UAAwB,SAAiB,OAAoB,WAAyB;AAC9H,QAAM,SAAS,MAAM,WAAW,UAAU,UAAU;AACpD,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWhB,EAAE;AAAA,IACD,MAAM;AAAA,IAAU;AAAA,IAAS;AAAA,IAAQ,MAAM,OAAO,iBAAiB;AAAA,IAAM,MAAM,IAAI,OAAO;AAAA,IACtF,MAAM,OAAO,mBAAmB,MAAM,IAAI,mBAAmB;AAAA,IAAM,MAAM;AAAA,IAAc,MAAM;AAAA,IAC7F,MAAM;AAAA,IAAQ,MAAM,WAAW;AAAA,IAAM,MAAM,YAAY;AAAA,IAAM,MAAM,YAAY;AAAA,IAC/E,MAAM,OAAO,cAAc,MAAM,IAAI,cAAc;AAAA,IAAM,MAAM,OAAO,gBAAgB,MAAM,IAAI,gBAAgB;AAAA,IAChH;AAAA,IAAW;AAAA,IAAW;AAAA,EACxB;AACA,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,MAAM,UAAU,SAAS;AAClC;AAEO,SAAS,oBAAoB,SAAiB,SAAiB,WAAiC;AACrG,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,kBAAc,UAAU,OAAO;AAC/B,0BAAsB,UAAU,SAAS,SAAS,SAAS;AAAA,EAC7D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,aAAa,QAA0B;AAC9C,SAAO,OAAO,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AACvC;AAEA,SAAS,kBAAkB,QAA2B,SAAwC;AAC5F,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,OAAO,oBAAoB,GAAG,QAAQ,IAAI,YAAU,OAAO,QAAQ,EAAE,OAAO,OAAO,CAAa,CAAC,CAAC;AACxH;AAEA,SAAS,cAAc,KAAwC;AAC7D,SAAO;AAAA,IACL,UAAU,IAAI;AAAA,IACd,cAAc,IAAI;AAAA,IAClB,aAAa,IAAI,eAAe;AAAA,IAChC,YAAY,IAAI,cAAc;AAAA,IAC9B,OAAO,IAAI,SAAS;AAAA,IACpB,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,SAAS,iBAAiB,KAAwC;AAChE,SAAO;AAAA,IACL,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,cAAc,IAAI,gBAAgB;AAAA,IAClC,WAAW,IAAI,aAAa;AAAA,IAC5B,KAAK,IAAI,OAAO;AAAA,IAChB,OAAO,IAAI,SAAS;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,iBAAiB,KAA8C;AACtE,SAAO;AAAA,IACL,eAAe,IAAI;AAAA,IACnB,UAAU,IAAI;AAAA,IACd,OAAO,IAAI,SAAS;AAAA,IACpB,aAAa,IAAI;AAAA,EACnB;AACF;AAEO,SAAS,qBACd,UACA,SACA,SACA,SAC0C;AAC1C,QAAM,eAAe,IAAI,IAAI,QAAQ,IAAI,YAAU,CAAC,OAAO,IAAI,kBAAkB,QAAQ,QAAQ,OAAO,YAAU,OAAO,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACpJ,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/D,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AACnC,QAAM,SAAS,aAAa,QAAQ;AACpC,QAAM,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA,yBAGV,MAAM;AAAA,GAC5B,EAAE,IAAI,GAAG,QAAQ;AAClB,QAAM,aAAa,SAAS,QAAQ;AAAA;AAAA;AAAA,4CAGM,MAAM;AAAA,GAC/C,EAAE,IAAI,SAAS,GAAG,QAAQ;AAC3B,QAAM,aAAa,SAAS,QAAQ;AAAA;AAAA;AAAA,4CAGM,MAAM;AAAA,GAC/C,EAAE,IAAI,SAAS,GAAG,QAAQ;AAC3B,SAAO,OAAO,YAAY,QAAQ,IAAI,YAAU;AAC9C,UAAM,MAAM,aAAa,IAAI,OAAO,EAAE,KAAK,CAAC;AAC5C,UAAM,SAAS,QAAQ,KAAK,SAAO,IAAI,SAAS,IAAI,QAAQ,CAAC;AAC7D,UAAM,YAAY,WAAW,KAAK,SAAO,IAAI,SAAS,IAAI,QAAQ,CAAC;AACnE,WAAO,CAAC,OAAO,IAAI;AAAA,MACjB,QAAQ,SAAS,cAAc,MAAM,IAAI;AAAA,MACzC,YAAY,WAAW,OAAO,SAAO,IAAI,SAAS,IAAI,QAAQ,CAAC,EAAE,IAAI,gBAAgB;AAAA,MACrF,WAAW,YAAY,iBAAiB,SAAS,IAAI;AAAA,IACvD,CAAC;AAAA,EACH,CAAC,CAAC;AACJ;;;AJ7KA,SAAS,cAAc,MAAuB;AAC5C,QAAM,cAAcG,MAAK,MAAM,cAAc;AAC7C,MAAI,CAACC,YAAW,WAAW,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,cAAc,KAAK,MAAMC,cAAa,aAAa,MAAM,CAAC;AAChE,WAAO,YAAY,SAAS;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAA0B;AACjC,QAAM,YAAYC,SAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZC,SAAQ,WAAW,IAAI;AAAA,IACvBA,SAAQ,WAAW,OAAO;AAAA,IAC1B,QAAQ,IAAI;AAAA,EACd,EAAE,OAAO,CAAC,cAAmC,QAAQ,SAAS,CAAC;AAC/D,QAAM,OAAO,WAAW,KAAK,aAAa;AAC1C,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uCAAuC;AAClE,SAAO;AACT;AAEO,IAAM,WAAW,gBAAgB;AACjC,IAAM,iBAAiB;AACvB,IAAM,iBAAiB,QAAQ,IAAI,2BAA2B;AACrE,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,eAAe,oBAAI,IAAsB,CAAC,SAAS,SAAS,OAAO,SAAS,OAAO,OAAO,CAAC;AACjG,IAAM,eAAe,CAAC,YAAY,QAAQ,UAAU,aAAa,SAAS;AAC1E,IAAM,oBAAoB,oBAAI,IAAqB,CAAC,WAAW,aAAa,UAAU,SAAS,CAAC;AAChG,IAAM,qBAAqB;AAO3B,IAAM,oBAAN,cAAgC,MAAM;AAAA,EACpC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,iBAAiB;AAC1B;AAEO,SAAS,aAAa,UAAU,gBAAwB;AAC7D,MAAI,CAAC,mBAAmB,KAAK,OAAO,GAAG;AACrC,UAAM,IAAI,kBAAkB,sCAAsC;AAAA,EACpE;AACA,SAAO;AACT;AAEO,SAAS,YAAY,UAAU,gBAAwB;AAC5D,SAAOJ,MAAK,UAAU,aAAa,OAAO,GAAG,UAAU,cAAc;AACvE;AAEA,SAAS,mBAAmB,UAAU,gBAAwB;AAC5D,SAAOA,MAAK,UAAU,YAAY,aAAa,OAAO,GAAG,UAAU,cAAc;AACnF;AAEA,SAAS,oBAAoB,UAAU,gBAAwB;AAC7D,QAAM,OAAO,YAAY,OAAO;AAChC,MAAIC,YAAW,IAAI,EAAG,QAAO;AAC7B,QAAM,QAAQ,aAAa,OAAO;AAClC,MAAI,UAAU,kBAAkBA,YAAW,mBAAmB,KAAK,CAAC,EAAG,QAAO,mBAAmB,KAAK;AACtG,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAgC,kBAAkB,gBAA8B;AAC/G,QAAM,UAAU,aAAa,QAAQ,WAAW,QAAQ,WAAW,eAAe;AAClF,QAAM,UAAU,QAAQ,WAAW;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,SAAS,QAAQ,UAAU,CAAC,GAAG,IAAI,YAAU;AAAA,MAC3C,GAAG;AAAA,MACH,QAAQ,MAAM,UAAU;AAAA,MACxB,SAAS,MAAM,WAAW,MAAM,WAAW;AAAA,MAC3C,SAAS,MAAM,WAAW,MAAM,WAAW;AAAA,IAC7C,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,WAAW,SAAiB,SAAiB,SAAS,WAAW;AACxE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,KAAK,YAAY,cAAc,2CAA2C,OAAO,gCAAgC,MAAM,uBAAuB,OAAO,IAAI,OAAO;AAAA,IAChK,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACF;AAEA,SAAS,cAAc,QAMP;AACd,SAAO;AAAA,IACL,UAAU,OAAO,YAAY;AAAA,IAC7B,UAAU,OAAO,YAAY;AAAA,IAC7B,cAAc;AAAA,IACd,KAAK,OAAO,OAAO;AAAA,IACnB,MAAM,OAAO,QAAQ;AAAA,IACrB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa,OAAO,eAAe,OAAO,SAAS,QAAQ,MAAM,GAAG;AAAA,IACpE,GAAG;AAAA,EACL;AACF;AAEA,SAAS,yBAAuC;AAC9C,SAAO,iBAAiB;AAAA,IACtB,QAAQ;AAAA,MACN,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,IAAI,WAAW,gDAAgD,MAAM;AAAA,QACrE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,IAAI,WAAW,uCAAuC,UAAU;AAAA,QAChE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,UACX,SAAS;AAAA,UACT,OAAO;AAAA,UACP,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,QACd,CAAC;AAAA,QACD,IAAI,WAAW,qDAAqD,YAAY,UAAU;AAAA,QAC1F,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,IAAI,WAAW,2CAA2C,QAAQ;AAAA,QAClE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,UACX,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,YAAY;AAAA,QACd,CAAC;AAAA,QACD,IAAI,WAAW,sCAAsC,WAAW,WAAW;AAAA,QAC3E,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI,WAAW,+CAA+C,WAAW;AAAA,QACzE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,EACX,GAAG,cAAc;AACnB;AAEA,SAAS,yBAAyB,SAAgC;AAChE,SAAO,QAAQ,YAAY,kBAAkB,CAACA,YAAW,YAAY,cAAc,CAAC;AACtF;AAEA,SAAS,uBAAuB,OAA4B;AAC1D,QAAM,QAAQ,GAAG,MAAM,KAAK;AAAA,EAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AAChE,QAAMI,OAAM,8bAA8bC,eAAc,MAAM,QAAQ,CAAC,6FAA6FA,eAAc,KAAK,CAAC;AACxlB,SAAO,6BAA6B,OAAO,KAAKD,IAAG,EAAE,SAAS,QAAQ,CAAC;AACzE;AAEA,SAASC,eAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;AAEO,SAAS,YAAY,UAAU,gBAA8B;AAClE,QAAM,OAAO,YAAY,OAAO;AAChC,MAAIL,YAAW,IAAI,GAAG;AACpB,QAAI;AACF,aAAO,iBAAiB,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC,GAA4B,OAAO;AAAA,IAClG,SAAS,OAAO;AACd,UAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,MAAM,SAAS,UAAU;AACpF,cAAM,IAAI,kBAAkB,oBAAoB,IAAI,IAAI,GAAG;AAAA,MAC7D;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,QAAQ,aAAa,OAAO;AAClC,MAAI,UAAU,gBAAgB;AAC5B,UAAM,cAAc,mBAAmB,KAAK;AAC5C,QAAID,YAAW,WAAW,GAAG;AAC3B,aAAO,iBAAiB,KAAK,MAAMC,cAAa,aAAa,MAAM,CAAC,GAA4B,OAAO;AAAA,IACzG;AACA,WAAO,uBAAuB;AAAA,EAChC;AACA,QAAM,IAAI,kBAAkB,oBAAoB,IAAI,IAAI,GAAG;AAC7D;AAEA,SAAS,YAAY,SAAiB,SAAqC;AACzE,QAAM,aAAa,iBAAiB,SAAS,OAAO;AACpD,EAAAK,WAAUJ,SAAQ,YAAY,OAAO,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,gBAAc,YAAY,OAAO,GAAG,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,CAAI;AAC9E,SAAO;AACT;AAEA,SAAS,IAAI,SAAiB,MAA+B;AAC3D,QAAM,SAAS,UAAU,SAAS,MAAM;AAAA,IACtC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAChC,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,YAAY,QAAQ,IAAI,cAAc;AAAA,MACtC,oBAAoB,QAAQ,IAAI,sBAAsB;AAAA,IACxD;AAAA,EACF,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,SAAS,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK;AAC1D,UAAM,IAAI,kBAAkB,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,UAAU,SAAS,KAAK,MAAM,KAAK,EAAE,IAAI,GAAG;AAAA,EACtG;AAEA,SAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO;AACxD;AAEA,SAAS,OAAO,MAA+B;AAC7C,SAAO,IAAI,OAAO,IAAI;AACxB;AAEO,SAAS,eAAiC;AAC/C,QAAM,WAAWK,aAAY,UAAU,EAAE,eAAe,KAAK,CAAC,EAC3D,OAAO,WAAS,MAAM,YAAY,KAAK,mBAAmB,KAAK,MAAM,IAAI,KAAKP,YAAW,YAAY,MAAM,IAAI,CAAC,CAAC,EACjH,QAAQ,WAAS;AAChB,QAAI;AACF,YAAM,UAAU,YAAY,MAAM,IAAI;AACtC,aAAO,CAAC,EAAE,SAAS,QAAQ,SAAS,SAAS,QAAQ,SAAS,aAAa,oBAAoB,MAAM,IAAI,GAAG,gBAAgB,QAAQ,gBAAgB,gBAAgB,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,OAAO,CAAC;AAAA,IAClO,SAAS,OAAO;AACd,UAAI,iBAAiB,qBAAqB,MAAM,WAAW,IAAK,QAAO,CAAC;AACxE,YAAM;AAAA,IACR;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AACpD,MAAI,CAAC,SAAS,KAAK,UAAQ,KAAK,YAAY,cAAc,GAAG;AAC3D,UAAM,UAAU,YAAY,cAAc;AAC1C,aAAS,KAAK,EAAE,SAAS,QAAQ,SAAS,SAAS,QAAQ,SAAS,aAAa,oBAAoB,cAAc,GAAG,gBAAgB,QAAQ,gBAAgB,gBAAgB,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,OAAO,CAAC;AAC1O,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,UAAU,SAAuB,SAA8B;AACtE,QAAM,QAAQ,QAAQ,OAAO,KAAK,UAAQ,KAAK,aAAa,OAAO;AACnE,MAAI,CAAC,MAAO,OAAM,IAAI,kBAAkB,kBAAkB,OAAO,IAAI,GAAG;AACxE,SAAO;AACT;AAEA,IAAM,iBAAiB,uBAAuB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,aAAa,CAAC,SAAS,WAAW,IAAI,kBAAkB,SAAS,MAAM;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AACzB,CAAC;AAED,SAAS,aAA+B,QAAmC;AACzE,SAAO,MAAM,KAAK,IAAI,IAAI,OAAO,OAAO,OAAO,CAAQ,CAAC,EAAE,KAAK;AACjE;AAEA,SAAS,UAAU,QAAoC;AACrD,SAAO;AAAA,IACL,WAAW,aAAa,OAAO,IAAI,WAAS,MAAM,QAAQ,CAAC;AAAA,IAC3D,WAAW,aAAa,OAAO,IAAI,WAAS,MAAM,QAAQ,CAAC;AAAA,IAC3D,UAAU,aAAa,CAAC,GAAG,cAAc,GAAG,OAAO,IAAI,WAAS,MAAM,OAAO,CAAC,CAAC;AAAA,IAC/E,cAAc,aAAa,OAAO,IAAI,WAAS,MAAM,YAAY,CAAC;AAAA,IAClE,mBAAmB,aAAa,OAAO,QAAQ,WAAS,MAAM,YAAY,IAAI,eAAa,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,IACnH,UAAU,aAAa,OAAO,IAAI,WAAS,MAAM,MAAM,CAAC;AAAA,IACxD,gBAAgB,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA,EACpF;AACF;AAEA,SAAS,eAAe,QAAuB,SAA2C;AACxF,QAAM,QAAQ,QAAQ,OAAO,KAAK,EAAE,YAAY;AAChD,SAAO,OAAO,OAAO,WAAS;AAC5B,QAAI,QAAQ,UAAU,QAAQ,WAAW,SAAS,MAAM,WAAW,QAAQ,OAAQ,QAAO;AAC1F,QAAI,QAAQ,WAAW,QAAQ,YAAY,SAAS,MAAM,YAAY,QAAQ,QAAS,QAAO;AAC9F,QAAI,QAAQ,QAAQ,QAAQ,SAAS,SAAS,MAAM,iBAAiB,QAAQ,KAAM,QAAO;AAC1F,QAAI,QAAQ,oBAAoB,gBAAgB,MAAM,YAAY,KAAK,eAAa,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3H,QAAI,QAAQ,mBAAmB,CAAC,CAAC,OAAO,YAAY,EAAE,SAAS,QAAQ,eAAe,KAAK,CAAC,MAAM,YAAY,KAAK,eAAa,UAAU,WAAW,QAAQ,eAAe,EAAG,QAAO;AACtL,QAAI,QAAQ,YAAY,QAAQ,aAAa,SAAS,MAAM,aAAa,QAAQ,SAAU,QAAO;AAClG,QAAI,QAAQ,YAAY,QAAQ,aAAa,SAAS,MAAM,aAAa,QAAQ,SAAU,QAAO;AAClG,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,CAAC,MAAM,UAAU,MAAM,OAAO,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,MAAM,GAAG,EACtG,KAAK,GAAG,EACR,YAAY,EACZ,SAAS,KAAK;AAAA,EACnB,CAAC;AACH;AAEO,SAAS,WAAW,UAAU,gBAAgB,UAA6B,CAAC,GAAyB;AAC1G,QAAM,UAAU,YAAY,OAAO;AACnC,QAAM,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,QAAQ,YAAY,EAAE,GAAG,CAAC,GAAG,GAAG;AAC1E,QAAM,OAAO,KAAK,IAAI,OAAO,QAAQ,QAAQ,CAAC,GAAG,CAAC;AAClD,QAAMQ,eAAc,sBAAsB,UAAU,QAAQ,SAAS,OAAO;AAC5E,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,eAAe,WAAW,UAAUA,eAAc,WAAW,QAAQ,CAAC,GAAGA,cAAa,GAAG,QAAQ,MAAM,IAAI,QAAQ;AACzH,QAAM,WAAW,eAAe,cAAc,OAAO;AACrD,QAAM,aAAa,KAAK,IAAI,KAAK,KAAK,SAAS,SAAS,QAAQ,GAAG,CAAC;AACpE,QAAM,WAAW,KAAK,IAAI,MAAM,UAAU;AAC1C,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,aAAa,SAAS,MAAM,OAAO,QAAQ,QAAQ;AACzD,MAAI,cAA8B,CAAC;AACnC,MAAI;AACJ,MAAI,QAAQ,eAAe,CAAC,yBAAyB,OAAO,GAAG;AAC7D,QAAI;AACF,oBAAc,eAAe,gBAAgB,OAAO;AAAA,IACtD,SAAS,KAAK;AACZ,cAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACzD;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,QAAQ,SAAS,SAAS,QAAQ,SAAS,gBAAgB,QAAQ,gBAAgB,gBAAgB,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,OAAO;AAAA,IAClL,QAAQ;AAAA,IACR,QAAQ,UAAU,QAAQ,MAAM;AAAA,IAChC,YAAY,EAAE,MAAM,UAAU,UAAU,OAAO,SAAS,QAAQ,WAAW;AAAA,IAC3E;AAAA,IACA,eAAe,YAAY,OAAO,YAAU,CAAC,OAAO,SAAS;AAAA,IAC7D,UAAU,QAAQ,eAAe,CAAC,yBAAyB,OAAO,IAAI,eAAe,YAAY,IAAI;AAAA,IACrG,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAMO,SAAS,gBAAgB,UAAU,gBAAgC;AACxE,QAAM,UAAU,YAAY,OAAO;AACnC,SAAO,EAAE,SAAS,QAAQ,SAAS,SAAS,QAAQ,SAAS,aAAa,oBAAoB,OAAO,GAAG,gBAAgB,QAAQ,gBAAgB,gBAAgB,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,OAAO;AAC7N;AAqBO,SAAS,UAAU,SAAiB,SAAiB,MAAM,kBAAoC;AACpG,SAAO,eAAe,UAAU,SAAS,SAAS,GAAG;AACvD;AAEA,SAAS,oBAAoB,QAAyB;AACpD,MAAI,CAAC,OAAO,QAAS,OAAM,IAAI,kBAAkB,4BAA4B;AAC7E,MAAI,CAAC,kBAAkB,IAAI,OAAO,MAAM,EAAG,OAAM,IAAI,kBAAkB,iCAAiC,OAAO,MAAM,EAAE;AACvH,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,cAAc,EAAE,cAAc,OAAO,YAAY,IAAI,CAAC;AAAA,IACjE,GAAI,OAAO,WAAW,EAAE,WAAW,OAAO,SAAS,IAAI,CAAC;AAAA,IACxD,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,IACxC,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,YAAY;AAAA,EACd;AACF;AAOO,SAAS,gBAAgB,SAAiB,QAA2C;AAC1F,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,kBAAkB,6CAA6C;AACnG,QAAM,UAAU,YAAY,OAAO;AACnC,QAAM,QAAQ,UAAU,SAAS,OAAO,OAAO;AAC/C,QAAM,YAAY,oBAAoB,MAAM;AAC5C,QAAM,WAAW,MAAM,YAAY,UAAU,UAAQ,KAAK,YAAY,UAAU,OAAO;AACvF,MAAI,aAAa,UAAa,YAAY,EAAG,OAAM,WAAY,QAAQ,IAAI;AAAA,MACtE,OAAM,aAAa,CAAC,GAAI,MAAM,cAAc,CAAC,GAAI,SAAS;AAC/D,cAAY,SAAS,OAAO;AAC5B,sBAAoB,SAAS,MAAM,UAAU,SAAS;AACtD,SAAO,EAAE,IAAI,MAAM,SAAS,UAAU,MAAM,QAAQ,IAAI,UAAU,MAAM,QAAQ,UAAU,OAAO,IAAI,QAAQ;AAC/G;AAEO,SAAS,aAAa,SAAiB,SAAiB,YAAY,KAAsB;AAC/F,QAAM,UAAU,YAAY,OAAO;AACnC,MAAI,yBAAyB,OAAO,GAAG;AACrC,UAAM,QAAQ,UAAU,SAAS,OAAO;AACxC,WAAO,EAAE,SAAS,MAAM,UAAU,WAAW,KAAK,uBAAuB,KAAK,EAAE;AAAA,EAClF;AACA,SAAO,eAAe,aAAa,SAAS,SAAS,SAAS;AAChE;AAEO,SAASC,kBAAiB,cAA8B;AAC7D,MAAI;AACF,WAAO,iBAAwB,UAAU,YAAY;AAAA,EACvD,SAAS,OAAO;AACd,UAAM,IAAI,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,8BAA8B,GAAG;AAAA,EACxG;AACF;AAEO,SAAS,aAAa,SAAiB,SAAiB,cAAyC;AACtG,SAAO,eAAe,aAAa,SAAS,SAAS,YAAY;AACnE;AAEO,SAAS,aAAa,SAAiB,SAAiB,gBAA2C;AACxG,MAAI,CAAC,eAAgB,OAAM,IAAI,kBAAkB,sCAAsC;AACvF,QAAM,UAAU,YAAY,OAAO;AACnC,QAAM,QAAQ,UAAU,SAAS,OAAO;AACxC,QAAM,SAAS;AACf,cAAY,SAAS,OAAO;AAC5B,SAAO,EAAE,IAAI,MAAM,SAAS,YAAY,OAAO,IAAI,QAAQ;AAC7D;AAEO,SAAS,YAAY,MAAc,QAAwC;AAChF,SAAO,eAAe,YAAY,MAAM,MAAM;AAChD;AAEO,SAAS,oBAAoB,SAAiB,SAAiB,cAAwC;AAC5G,SAAO,eAAe,oBAAoB,SAAS,SAAS,YAAY;AAC1E;AAEO,SAAS,kBAA0B;AACxC,QAAM,MAAMC,MAAK,UAAU,kBAAkB,gBAAgB;AAC7D,EAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,SAAO;AACT;AAEO,SAAS,oBAAoB,MAAqB;AACvD,MAAI,CAAC,KAAM;AACX,QAAM,aAAa,gBAAgB;AACnC,QAAM,WAAWC,SAAQ,IAAI;AAC7B,MAAI,SAAS,WAAW,GAAG,UAAU,GAAG,KAAKC,YAAW,QAAQ,GAAG;AACjE,eAAW,QAAQ;AAAA,EACrB;AACF;;;AK/fA,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACnC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,iBAAiB;AAC1B;AAEO,SAAS,aAAa,SAAiB,UAAyC;AACrF,QAAM,MAAM,CAAC,GAAG,IAAI,IAAI,SAAS,IAAI,aAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAChF,MAAI,IAAI,SAAS,GAAI,OAAM,IAAI,iBAAiB,yCAAyC;AACzF,QAAM,UAAU,YAAY,aAAa,OAAO,CAAC;AACjD,QAAMC,eAAc,sBAAsB,UAAU,QAAQ,SAAS,OAAO;AAC5E,QAAM,OAAO,oBAAI,IAAyB;AAC1C,aAAW,SAAS,CAAC,GAAG,QAAQ,QAAQ,GAAGA,YAAW,GAAG;AACvD,QAAI,IAAI,SAAS,MAAM,QAAQ,KAAK,CAAC,KAAK,IAAI,MAAM,QAAQ,EAAG,MAAK,IAAI,MAAM,UAAU,KAAK;AAAA,EAC/F;AACA,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,QAAQ,IAAI,QAAQ,aAAW,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC;AAAA,IACtD,SAAS,IAAI,OAAO,aAAW,CAAC,KAAK,IAAI,OAAO,CAAC;AAAA,IACjD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;AC7BA,SAAS,QAAAC,aAAY;;;ACGd,IAAM,+BAA+B;AASrC,SAAS,YAAY,SAAiB,MAAc,SAAyB;AAClF,SAAO,GAAG,OAAO,IAAI,IAAI,aAAa,OAAO;AAC/C;AAEO,SAAS,aAAa,UAAwB,SAAiB,MAAqC;AACzG,SAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKvB,EAAE,IAAI,SAAS,IAAI;AACtB;AAEO,SAAS,wBAAwB,QAAmC;AACzE,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,OAAO,WAAW,EAAE,EAAE,IAAI,aAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACvH;;;AC3BA,SAAS,eAAAC,oBAAmB;;;ACA5B,SAAS,cAAAC,aAAY,aAAa,uBAAuB;AAyEzD,IAAM,oBAAoB,KAAK;AAC/B,IAAM,mBAAmB,IAAI;AAC7B,IAAM,oBAAoB,KAAK;AAC/B,IAAM,SAAS,oBAAI,IAAyB,CAAC,qBAAqB,gBAAgB,gBAAgB,sBAAsB,iBAAiB,iBAAiB,CAAC;AAGpJ,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,SAAwB,SAAS,KAAY,OAAO,qBAA4B,YAA0B,CAAC,GAAG;AACxH,UAAM,OAAO;AADqB;AAAqB;AAAmC;AAAA,EAE5F;AAAA,EAFoC;AAAA,EAAqB;AAAA,EAAmC;AAG9F;AAEO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,iBAAiB;AAC1B;AAMO,SAAS,cAAc,OAAwB;AACpD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,iBAAiB;AAClD,MAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,sBAAsB,KAAK,EAAE;AACnE,QAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,aAAa,SAAS,MAAM,OAAO,SAAS,MAAM,KAAK;AAC7D,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,MAAM,UAAU,KAAK,KAAK,IAAI;AACxE,UAAM,IAAI,gBAAgB,mDAAmD;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,YAAY,CAAC;AACnG;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAOC,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAEA,SAAS,UAAU,GAAW,GAAoB;AAChD,QAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,SAAO,KAAK,WAAW,MAAM,UAAU,gBAAgB,MAAM,KAAK;AACpE;AAEA,SAAS,cAAc,WAAmB,YAA4B;AACpE,SAAO,IAAI,KAAK,IAAI,KAAK,SAAS,EAAE,QAAQ,IAAI,aAAa,GAAI,EAAE,YAAY;AACjF;AAEA,SAAS,aAAaC,WAAmD;AACvE,SAAOA,YAAW,KAAK,UAAUA,SAAQ,IAAI;AAC/C;AAEA,SAAS,cAAc,OAAqD;AAC1E,MAAI,OAAO,UAAU,YAAY,CAAC,MAAO,QAAO;AAChD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAAI,SAAoC;AAAA,EAC9G,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAA6E,MAAM,oBAAI,KAAK,GAAgC;AAChJ,MAAI,IAAI,WAAW,SAAU,QAAO,IAAI,WAAW,YAAY,YAAY;AAC3E,MAAI,IAAI,KAAK,IAAI,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,EAAG,QAAO;AAChE,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,YAAY,EAAE,QAAQ,KAAK,GAAI,CAAC;AACxG,MAAI,cAAc,kBAAmB,QAAO;AAC5C,MAAI,cAAc,iBAAkB,QAAO;AAC3C,SAAO;AACT;AAEA,SAAS,WAAW,KAAU,MAAM,oBAAI,KAAK,GAAe;AAC1D,QAAM,cAAc,OAAO,IAAI,YAAY;AAC3C,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,WAAW,OAAO,IAAI,SAAS;AAAA,IAC/B,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,IACxE,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,IAC5D,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IAC/D,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,cAAc;AAAA,IACd,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,iBAAiB,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AAAA,IACjF,UAAU,cAAc,IAAI,aAAa;AAAA,IACzC,uBAAuB,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,IAAI,KAAK,WAAW,EAAE,QAAQ,KAAK,GAAI,CAAC;AAAA,IACvG,eAAe,aAAa;AAAA,MAC1B,YAAY,OAAO,IAAI,UAAU;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,OAAO,IAAI,MAAM;AAAA,IAC3B,GAAG,GAAG;AAAA,EACR;AACF;AAEA,SAAS,WAAW,KAA2B;AAC7C,SAAO;AAAA,IACL,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,UAAU,cAAc,IAAI,aAAa;AAAA,EAC3C;AACF;AAEA,SAASC,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAAS,YAAY,UAAwB,SAAiB,WAAmB,OAAgB,SAAkBD,WAA0C;AAC3J,WAAS,QAAQ;AAAA;AAAA;AAAA,GAGhB,EAAE,IAAI,SAAS,aAAa,GAAG,SAAS,WAAW,SAAS,MAAM,WAAW,MAAM,OAAO,GAAG,aAAaA,SAAQ,CAAC;AACtH;AAEA,SAAS,mBAAmB,UAA8B;AACxD,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,SAAS,QAAQ;AAAA;AAAA,GAEhC,EAAE,IAAI,SAAS;AAChB,MAAI,QAAQ,WAAW,EAAG;AAC1B,WAAS,QAAQ;AAAA;AAAA,GAEhB,EAAE,IAAI,SAAS;AAChB,aAAW,SAAS,QAAS,aAAY,UAAU,MAAM,IAAI,WAAW,UAAU,uCAAuC;AAC3H;AAEA,SAAS,eAAe,WAAqD;AAC3E,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG,OAAM,IAAI,gBAAgB,4BAA4B,SAAS,EAAE;AAC7F,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAe,OAAyB;AAC/D,SAAO,CAAC,QAAQ,CAAC,SAAS,SAAS;AACrC;AAEA,SAAS,cAAc,WAAiF,UAA+B;AACrI,MAAI,UAAU,YAAY,SAAS,QAAS,QAAO;AACnD,MAAI,CAAC,gBAAgB,UAAU,SAAS,SAAS,OAAO,EAAG,QAAO;AAClE,MAAI,UAAU,eAAe,SAAS,cAAc,UAAU,cAAc,SAAS,UAAW,QAAO;AACvG,SAAO,UAAU,eAAe,qBAAqB,SAAS,eAAe;AAC/E;AAEA,SAAS,aAAa,UAAwB,SAAgC;AAC5E,QAAM,OAAO,UACT,SAAS,QAAQ,kGAAkG,EAAE,IAAI,OAAO,IAChI,SAAS,QAAQ,2FAA2F,EAAE,IAAI;AACtH,SAAQ,KAAe,IAAI,SAAO,WAAW,GAAG,CAAC;AACnD;AAEA,SAAS,cAAc,UAAwB,SAAiB,SAAqC;AACnG,QAAM,MAAM,UACR,SAAS,QAAQ,4DAA4D,EAAE,IAAI,SAAS,OAAO,IACnG,SAAS,QAAQ,yCAAyC,EAAE,IAAI,OAAO;AAC3E,SAAO,MAAM,WAAW,GAAU,IAAI;AACxC;AAEA,SAAS,oBAAoB,UAAwB,YAAgC;AACnF,QAAM,UAAU,WAAW,MAAM,GAAG,EAAE,CAAC;AACvC,QAAM,MAAM,SAAS,QAAQ,yCAAyC,EAAE,IAAI,OAAO;AACnF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,UAAU,OAAO,IAAI,UAAU,GAAG,UAAU,UAAU,CAAC,IAAI,MAAM;AAC1E;AAEA,SAAS,OAAO,MAAc,SAAiB,YAA0B,CAAC,GAA+B;AACvG,SAAO,EAAE,IAAI,OAAO,MAAM,SAAS,UAAU;AAC/C;AAEA,SAAS,iBAAiB,OAAmB,WAAgC,UAAkB,WAA4B;AACzH,MAAI,MAAM,eAAe,aAAa,MAAM,cAAc,SAAU,QAAO;AAC3E,MAAI,MAAM,eAAe,kBAAmB,QAAO;AACnD,MAAI,MAAM,eAAe,uBAAuB,cAAc,oBAAqB,QAAO,MAAM,cAAc;AAC9G,MAAI,MAAM,eAAe,wBAAwB,cAAc,qBAAsB,QAAO;AAC5F,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAgC;AAC/D,QAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,QAAM,WAAW,OAAO,SAAS,KAAK;AACtC,QAAM,YAAY,OAAO,UAAU,KAAK;AACxC,MAAI,CAAC,QAAS,OAAM,IAAI,gBAAgB,8BAA8B;AACtE,MAAI,CAAC,SAAU,OAAM,IAAI,gBAAgB,6BAA6B;AACtE,MAAI,CAAC,UAAW,OAAM,IAAI,gBAAgB,iCAAiC;AAC3E,QAAM,YAAY,eAAe,OAAO,SAAS;AACjD,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,IAAAC,eAAc,UAAU,OAAO;AAC/B,uBAAmB,QAAQ;AAC3B,UAAM,YAAY,EAAE,SAAS,SAAS,OAAO,SAAS,KAAK,KAAK,QAAW,YAAY,WAAW,WAAW,SAAS;AACtH,UAAM,YAAY,aAAa,UAAU,OAAO,EAAE,OAAO,CAAAC,WAAS,cAAc,WAAWA,MAAK,CAAC;AACjG,QAAI,UAAU,SAAS,KAAK,CAAC,OAAO,OAAO;AACzC,YAAM,IAAI,gBAAgB,yDAAyD,KAAK,0BAA0B,SAAS;AAAA,IAC7H;AACA,QAAI,UAAU,SAAS,KAAK,CAAC,OAAO,QAAQ,KAAK,GAAG;AAClD,YAAM,IAAI,gBAAgB,iDAAiD,KAAK,4BAA4B,SAAS;AAAA,IACvH;AACA,UAAM,YAAY,OAAO;AACzB,eAAW,YAAY,WAAW;AAChC,eAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,OAIhB,EAAE,IAAI,WAAW,WAAW,OAAO,UAAU,MAAM,SAAS,EAAE;AAC/D,kBAAY,UAAU,SAAS,IAAI,WAAW,WAAW,OAAO,UAAU,mCAAmC;AAC7G,kBAAY,UAAU,SAAS,IAAI,YAAY,WAAW,iBAAiB,SAAS,KAAK,EAAE,kBAAkB,SAAS,CAAC;AAAA,IACzH;AACA,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,SAAS,YAAY,EAAE,EAAE,SAAS,WAAW;AACnD,UAAM,aAAa,GAAG,EAAE,IAAI,MAAM;AAClC,UAAM,YAAY,cAAc,WAAW,UAAU;AACrD,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKhB,EAAE;AAAA,MACD;AAAA,MACA,UAAU,UAAU;AAAA,MACpB;AAAA,MACA,UAAU,WAAW;AAAA,MACrB;AAAA,MACA;AAAA,MACA,OAAO,aAAa,KAAK,KAAK;AAAA,MAC9B,OAAO,SAAS,KAAK,KAAK;AAAA,MAC1B;AAAA,MACA,OAAO,WAAW,KAAK,KAAK;AAAA,MAC5B,OAAO,UAAU,KAAK,KAAK;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,OAAO,QAAQ;AAAA,IAC9B;AACA,gBAAY,UAAU,IAAI,WAAW,WAAW,WAAW,SAAS,IAAI,QAAQ,KAAK,EAAE,aAAa,WAAW,CAAC;AAChH,UAAM,QAAQ,cAAc,UAAU,EAAE;AACxC,WAAO,EAAE,IAAI,MAAe,OAAO,aAAa,YAAY,mBAAmB,UAAU,IAAI,cAAY,SAAS,EAAE,EAAE;AAAA,EACxH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,SAAkB;AAChD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,OAAO,UACT,SAAS,QAAQ,oFAAoF,EAAE,IAAI,OAAO,IAClH,SAAS,QAAQ,2EAA2E,EAAE,IAAI;AACtG,WAAO,EAAE,IAAI,MAAe,QAAS,KAAe,IAAI,SAAO,WAAW,GAAG,CAAC,GAAG,WAAW,OAAO,EAAE;AAAA,EACvG,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiB,SAAkB;AACnE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,QAAQ,cAAc,UAAU,SAAS,OAAO;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,wBAAwB,OAAO,IAAI,KAAK,iBAAiB;AAC/F,UAAM,SAAS,SAAS,QAAQ,yEAAyE,EAAE,IAAI,MAAM,EAAE;AACvH,WAAO,EAAE,IAAI,MAAe,OAAO,QAAQ,OAAO,IAAI,UAAU,EAAE;AAAA,EACpE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,oBAAoB,YAAoB,aAAa,mBAAmB;AACtF,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,MAAM,oBAAoB,UAAU,UAAU;AACpD,QAAI,CAAC,IAAK,OAAM,IAAI,gBAAgB,yCAAyC,KAAK,qBAAqB;AACvG,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,MAAM,WAAW,SAAU,OAAM,IAAI,gBAAgB,kBAAkB,MAAM,MAAM,KAAK,KAAK,kBAAkB;AACnH,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ,uEAAuE,EAAE,IAAI,WAAW,cAAc,WAAW,UAAU,GAAG,MAAM,EAAE;AACvJ,gBAAY,UAAU,MAAM,IAAI,aAAa,MAAM,YAAY,2BAA2B;AAC1F,WAAO,EAAE,IAAI,MAAe,OAAO,cAAc,UAAU,MAAM,EAAE,EAAE;AAAA,EACvE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,YAAoB;AACpD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,MAAM,oBAAoB,UAAU,UAAU;AACpD,QAAI,CAAC,IAAK,OAAM,IAAI,gBAAgB,yCAAyC,KAAK,qBAAqB;AACvG,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,MAAM,WAAW,SAAU,OAAM,IAAI,gBAAgB,kBAAkB,MAAM,MAAM,KAAK,KAAK,kBAAkB;AACnH,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ,2EAA2E,EAAE,IAAI,WAAW,MAAM,EAAE;AACrH,gBAAY,UAAU,MAAM,IAAI,YAAY,MAAM,YAAY,iCAAiC;AAC/F,WAAO,EAAE,IAAI,MAAe,OAAO,cAAc,UAAU,MAAM,EAAE,EAAE;AAAA,EACvE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,uBAAuB,SAAiB,SAAiB,QAAoE;AAC3I,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,gBAAgB,6DAA6D,KAAK,wBAAwB;AAC9I,MAAI,CAAC,OAAO,QAAQ,KAAK,EAAG,OAAM,IAAI,gBAAgB,oDAAoD,KAAK,iBAAiB;AAChI,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,QAAQ,cAAc,UAAU,SAAS,OAAO;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,wBAAwB,OAAO,IAAI,KAAK,iBAAiB;AAC/F,QAAI,MAAM,WAAW,YAAY,MAAM,kBAAkB,SAAS;AAChE,YAAM,IAAI,gBAAgB,qEAAqE,KAAK,mBAAmB,CAAC,KAAK,CAAC;AAAA,IAChI;AACA,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ,gHAAgH,EAAE,IAAI,WAAW,OAAO,SAAS,SAAS,OAAO,QAAQ,MAAM,EAAE;AAClM,gBAAY,UAAU,MAAM,IAAI,YAAY,OAAO,SAAS,SAAS,OAAO,MAAM;AAClF,WAAO,EAAE,IAAI,MAAe,OAAO,cAAc,UAAU,MAAM,EAAE,EAAE;AAAA,EACvE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,iBAAiB,SAAiB,SAAiB,QAAoE;AACrI,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,gBAAgB,uDAAuD,KAAK,wBAAwB;AACxI,MAAI,CAAC,OAAO,QAAQ,KAAK,EAAG,OAAM,IAAI,gBAAgB,8CAA8C,KAAK,iBAAiB;AAC1H,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,QAAQ,cAAc,UAAU,SAAS,OAAO;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,wBAAwB,OAAO,IAAI,KAAK,iBAAiB;AAC/F,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ;AAAA;AAAA;AAAA,KAGhB,EAAE,IAAI,WAAW,OAAO,SAAS,SAAS,OAAO,QAAQ,MAAM,EAAE;AAClE,gBAAY,UAAU,MAAM,IAAI,WAAW,OAAO,SAAS,SAAS,OAAO,MAAM;AACjF,WAAO,EAAE,IAAI,MAAe,OAAO,cAAc,UAAU,MAAM,EAAE,EAAE;AAAA,EACvE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,2BAA2B,UAAwB,SAAiB,SAAiB,QAA6C;AAChJ,qBAAmB,QAAQ;AAC3B,QAAM,QAAQ,cAAc,UAAU,SAAS,OAAO;AACtD,MAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,wBAAwB,OAAO,IAAI,KAAK,iBAAiB;AAC/F,MAAI,MAAM,WAAW,SAAU,QAAO;AACtC,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA,GAGhB,EAAE,IAAI,WAAW,OAAO,SAAS,SAAS,OAAO,UAAU,MAAM,MAAM,EAAE;AAC1E,cAAY,UAAU,MAAM,IAAI,WAAW,OAAO,SAAS,SAAS,OAAO,MAAM;AACjF,SAAO,cAAc,UAAU,MAAM,IAAI,OAAO;AAClD;AAEO,SAAS,mBAAmB,SAAiB,SAAiB,QAAyF;AAC5J,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,gBAAgB,2DAA2D,KAAK,wBAAwB;AAC5I,QAAM,cAAc,OAAO,YAAY,KAAK;AAC5C,MAAI,CAAC,YAAa,OAAM,IAAI,gBAAgB,kCAAkC,KAAK,qBAAqB;AACxG,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,QAAQ,cAAc,UAAU,SAAS,OAAO;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,wBAAwB,OAAO,IAAI,KAAK,iBAAiB;AAC/F,QAAI,MAAM,WAAW,SAAU,OAAM,IAAI,gBAAgB,kBAAkB,MAAM,MAAM,KAAK,KAAK,kBAAkB;AACnH,aAAS,QAAQ,qDAAqD,EAAE,IAAI,aAAa,MAAM,EAAE;AACjG,gBAAY,UAAU,MAAM,IAAI,eAAe,OAAO,SAAS,SAAS,OAAO,UAAU,wBAAwB,WAAW,KAAK,EAAE,eAAe,YAAY,CAAC;AAC/J,WAAO,EAAE,IAAI,MAAe,OAAO,cAAc,UAAU,MAAM,EAAE,EAAE;AAAA,EACvE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,6BAA6B,OAA8C,QAA0F;AACnL,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,gBAAY,UAAU,MAAM,IAAI,iBAAiB,MAAM,YAAY,GAAG,OAAO,SAAS,aAAa;AAAA,MACjG,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO;AAAA,IACrB,CAAC;AACD,WAAO,EAAE,IAAI,KAAc;AAAA,EAC7B,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,2BAA2B,QAAsE;AAC/G,MAAI,OAAO,gBAAgB,YAAY,CAAC,OAAO,cAAc;AAC3D,WAAO,OAAO,+BAA+B,uDAAuD;AAAA,EACtG;AACA,MAAI,CAAC,OAAO,WAAY,QAAO,OAAO,kBAAkB,uDAAuD;AAC/G,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,uBAAmB,QAAQ;AAC3B,UAAM,MAAM,oBAAoB,UAAU,OAAO,UAAU;AAC3D,QAAI,CAAC,IAAK,QAAO,OAAO,uBAAuB,iCAAiC;AAChF,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,MAAM,WAAW,SAAU,QAAO,OAAO,oBAAoB,kBAAkB,MAAM,MAAM,GAAG;AAClG,QAAI,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ,KAAK,KAAK,IAAI,EAAG,QAAO,OAAO,iBAAiB,0BAA0B;AACjH,QAAI,MAAM,YAAY,OAAO,QAAS,QAAO,OAAO,0BAA0B,iBAAiB,MAAM,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC;AACzJ,QAAI,OAAO,WAAW,MAAM,WAAW,MAAM,YAAY,OAAO,SAAS;AACvE,aAAO,OAAO,0BAA0B,iBAAiB,MAAM,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC;AAAA,IACrH;AACA,QAAI,CAAC,iBAAiB,OAAO,OAAO,WAAW,OAAO,UAAU,OAAO,SAAS,GAAG;AACjF,aAAO,OAAO,wBAAwB,wBAAwB,OAAO,SAAS,IAAI,OAAO,QAAQ,KAAK,CAAC,KAAK,CAAC;AAAA,IAC/G;AACA,QAAI,OAAO,gBAAgB,OAAO;AAChC,kBAAY,UAAU,MAAM,IAAI,iBAAiB,MAAM,YAAY,GAAG,OAAO,SAAS,aAAa;AAAA,QACjG,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,IACH;AACA,WAAO,EAAE,IAAI,MAAM,OAAO,UAAU,CAAC,EAAE;AAAA,EACzC,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;ADhfA,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACnC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,iBAAiB;AAC1B;AAMA,IAAM,iBAAsC,CAAC,WAAW,WAAW,aAAa;AAChF,IAAM,YAAY,oBAAI,IAAqB,CAAC,WAAW,QAAQ,CAAC;AAChE,IAAM,eAAe,oBAAI,IAAuB,CAAC,WAAW,WAAW,eAAe,YAAY,WAAW,CAAC;AAEvG,SAAS,UAAU,SAAiB,aAAqB,eAAuB,UAAmC;AACxH,SAAO,GAAG,OAAO,IAAI,WAAW,iBAAiB,QAAQ,IAAI,aAAa;AAC5E;AAEA,SAASC,UAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAIC,aAAY,CAAC,EAAE,SAAS,WAAW,EAAE,YAAY,CAAC;AACnG;AAEA,SAASC,cAAaC,WAAmD;AACvE,SAAOA,YAAW,KAAK,UAAUA,SAAQ,IAAI;AAC/C;AAEA,SAAS,qBAAqBA,WAAyE;AACrG,MAAI,CAACA,UAAU,QAAO;AACtB,QAAM,OAAO,EAAE,GAAGA,UAAS;AAC3B,SAAO,KAAK;AACZ,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAC/C;AAEA,SAASC,eAAc,OAAqD;AAC1E,MAAI,OAAO,UAAU,YAAY,CAAC,MAAO,QAAO;AAChD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAAI,SAAoC;AAAA,EAC9G,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,SAAyB;AACjD,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,OAAM,IAAI,iBAAiB,+BAA+B;AACxE,SAAO;AACT;AAEA,SAAS,kBAAkB,UAA4C;AACrE,MAAI,CAAC,UAAU,IAAI,QAAQ,EAAG,OAAM,IAAI,iBAAiB,kCAAkC,QAAQ,EAAE;AACrG,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA8C;AACrE,MAAI,CAAC,aAAa,IAAI,MAAM,EAAG,OAAM,IAAI,iBAAiB,oCAAoC,MAAM,EAAE;AACtG,SAAO;AACT;AAEA,SAAS,eAAe,OAAe,OAAuB;AAC5D,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,OAAM,IAAI,iBAAiB,GAAG,KAAK,cAAc;AAC/D,SAAO;AACT;AAEA,SAAS,aAAa,UAAwB,SAAiB,SAAuB;AACpF,QAAM,MAAM,SAAS,QAAQ,uDAAuD,EAAE,IAAI,SAAS,OAAO;AAC1G,MAAI,CAAC,IAAK,OAAM,IAAI,iBAAiB,0BAA0B,OAAO,IAAI,GAAG;AAC/E;AAEA,SAAS,YAAY,KAAuB;AAC1C,QAAMD,YAAWC,eAAc,IAAI,aAAa;AAChD,QAAM,UAAU,OAAOD,WAAU,aAAa,WAAWA,UAAS,WAAW;AAC7E,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,iBAAiB,OAAO,IAAI,eAAe;AAAA,IAC3C,WAAW,OAAO,IAAI,SAAS;AAAA,IAC/B,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,IACxE,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,IACxE,4BAA4B,OAAO,IAAI,+BAA+B,WAAW,IAAI,6BAA6B;AAAA,IAClH,mBAAmB,OAAO,IAAI,sBAAsB,WAAW,IAAI,oBAAoB;AAAA,IACvF,qBAAqB;AAAA,IACrB,UAAAA;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAA4B;AAChD,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,UAAUC,eAAc,IAAI,aAAa;AAAA,EAC3C;AACF;AAEA,SAAS,SAAS,UAAwB,SAAiB,QAAoC;AAC7F,QAAM,MAAM,SAAS,QAAQ,6DAA6D,EAAE,IAAI,SAAS,MAAM;AAC/G,SAAO,MAAM,YAAY,GAAG,IAAI;AAClC;AAEA,SAAS,YAAY,UAAwB,SAAiB,QAA6B;AACzF,QAAM,OAAO,SAAS,UAAU,SAAS,MAAM;AAC/C,MAAI,CAAC,KAAM,OAAM,IAAI,iBAAiB,yBAAyB,MAAM,IAAI,GAAG;AAC5E,SAAO;AACT;AAEA,SAAS,WAAW,UAAwB,QAAoC;AAC9E,QAAM,OAAO,SAAS,QAAQ,gFAAgF,EAAE,IAAI,MAAM;AAC1H,SAAO,KAAK,IAAI,YAAY;AAC9B;AAEA,SAASC,aAAY,UAAwB,QAAgB,WAAmB,OAAgB,SAAkBF,WAA0C;AAC1J,WAAS,QAAQ;AAAA;AAAA;AAAA,GAGhB,EAAE,IAAIH,UAAS,oBAAoB,GAAG,QAAQ,WAAW,SAAS,MAAM,WAAW,MAAM,OAAO,GAAGE,cAAaC,SAAQ,CAAC;AAC5H;AAEA,SAAS,eAAe,UAAwB,SAAiB,QAA2C;AAC1G,SAAO,EAAE,SAAS,IAAI,MAAM,MAAM,YAAY,UAAU,SAAS,MAAM,GAAG,QAAQ,WAAW,UAAU,MAAM,EAAE;AACjH;AAEA,SAAS,cAAc,QAAsC,SAAuB;AAClF,MAAI,OAAO,OAAO,OAAO,MAAM,EAAG,OAAM,IAAI,iBAAiB,SAAS,GAAG;AAC3E;AAEA,SAAS,YAAe,UAAwB,UAAsB;AACpE,WAAS,KAAK,iBAAiB;AAC/B,MAAI;AACF,UAAM,QAAQ,SAAS;AACvB,aAAS,KAAK,QAAQ;AACtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,aAAS,KAAK,UAAU;AACxB,UAAM;AAAA,EACR;AACF;AAEA,SAAS,mBAAmB,UAAwB,SAAiB,QAAgB;AACnF,SAAO,EAAE,MAAM,YAAY,UAAU,SAAS,MAAM,GAAG,QAAQ,WAAW,UAAU,MAAM,EAAE;AAC9F;AAEO,SAAS,iBAAiB,SAAiB,aAAqBG,YAAgC,gBAAsC;AAC3I,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,qBAAqBA,UAAS,IAAI,eAAe;AACvD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,iBAAa,UAAU,mBAAmB,WAAW;AACrD,QAAI,mBAAmB,WAAW,GAAG;AACnC,aAAO,EAAE,SAAS,mBAAmB,eAAe,aAAa,OAAO,CAAC,GAAG,WAAW,OAAO,EAAE;AAAA,IAClG;AACA,UAAMC,gBAAe,mBAAmB,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAC/D,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA,kEAEgCA,aAAY;AAAA;AAAA,KAEzE,EAAE,IAAI,mBAAmB,aAAa,GAAG,kBAAkB;AAC5D,WAAO,EAAE,SAAS,mBAAmB,eAAe,aAAa,OAAO,KAAK,IAAI,WAAW,GAAG,WAAW,OAAO,EAAE;AAAA,EACrH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,eAAe,SAAiB,QAAgB;AAC9D,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,WAAO,EAAE,SAAS,mBAAmB,GAAG,mBAAmB,UAAU,mBAAmB,MAAM,EAAE;AAAA,EAClG,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiB,QAMrB;AAC5B,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,WAAW,kBAAkB,OAAO,QAAQ;AAClD,QAAM,SAAS,UAAU,mBAAmB,OAAO,aAAa,OAAO,eAAe,QAAQ;AAC9F,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,iBAAa,UAAU,mBAAmB,OAAO,WAAW;AAC5D,iBAAa,UAAU,mBAAmB,OAAO,aAAa;AAC9D,UAAM,WAAW,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKjC,EAAE,IAAI,mBAAmB,OAAO,aAAa,OAAO,eAAe,QAAQ;AAC5E,UAAM,eAAe,OAAO,cAAc,KAAK,KAAK;AACpD,QAAI,UAAU;AACZ,YAAM,OAAO,YAAY,QAAQ;AACjC,UAAI,KAAK,WAAW,aAAa,iBAAiB,UAAa,iBAAiB,KAAK,cAAc;AACjG,cAAM,IAAI,iBAAiB,uDAAuD,GAAG;AAAA,MACvF;AACA,UAAI,KAAK,WAAW,aAAa,iBAAiB,UAAa,iBAAiB,KAAK,cAAc;AACjG,cAAMC,aAAY,OAAO;AACzB,oBAAY,UAAU,MAAM;AAC1B,gBAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,WAI/B,EAAE,IAAI,cAAcA,YAAW,KAAK,EAAE;AACvC,wBAAc,QAAQ,qDAAqD;AAC3E,UAAAH,aAAY,UAAU,KAAK,IAAI,wBAAwB,OAAO,WAAW,uBAAuB;AAAA,QAClG,CAAC;AAAA,MACH;AACA,aAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,IAC5D;AACA,UAAM,aAAa,SAAS,UAAU,mBAAmB,MAAM;AAC/D,QAAI,YAAY;AACd,YAAMG,aAAY,OAAO;AACzB,kBAAY,UAAU,MAAM;AAC1B,cAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAM/B,EAAE,IAAI,gBAAgB,MAAM,OAAO,WAAWA,YAAW,MAAM;AAChE,sBAAc,QAAQ,uCAAuC;AAC7D,QAAAH,aAAY,UAAU,QAAQ,WAAW,OAAO,WAAW,uBAAuB;AAAA,MACpF,CAAC;AACD,aAAO,eAAe,UAAU,mBAAmB,MAAM;AAAA,IAC3D;AACA,UAAM,YAAY,OAAO;AACzB,gBAAY,UAAU,MAAM;AAC1B,eAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAKhB,EAAE,IAAI,QAAQ,mBAAmB,OAAO,aAAa,OAAO,eAAe,UAAU,gBAAgB,MAAM,OAAO,WAAW,WAAW,SAAS;AAClJ,MAAAA,aAAY,UAAU,QAAQ,WAAW,OAAO,WAAW,uBAAuB;AAAA,IACpF,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,MAAM;AAAA,EAC3D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,8BAA8B,SAAiB,QAA6E;AAC1I,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,eAAe,OAAO,aAAa,KAAK;AAC9C,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,QAAI,KAAK,WAAW,UAAW,OAAM,IAAI,iBAAiB,uDAAuD,GAAG;AACpH,UAAM,YAAY,OAAO;AACzB,gBAAY,UAAU,MAAM;AAC1B,YAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,OAI/B,EAAE,IAAI,gBAAgB,MAAM,WAAW,KAAK,EAAE;AAC/C,oBAAc,QAAQ,qDAAqD;AAC3E,MAAAA,aAAY,UAAU,KAAK,IAAI,wBAAwB,SAAS,uBAAuB;AAAA,IACzF,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,sBAAsB,SAAiB,QAAuF;AAC5I,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,QAAQ,eAAe,OAAO,OAAO,eAAe;AAC1D,QAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,MAAI,CAAC,QAAS,OAAM,IAAI,iBAAiB,6BAA6B;AACtE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,gBAAY,UAAU,MAAM;AAC1B,MAAAA,aAAY,UAAU,KAAK,IAAI,iBAAiB,OAAO,OAAO;AAAA,IAChE,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,iBAAiB,SAAiB,QAAuE;AACvH,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,YAAY,eAAe,OAAO,WAAW,YAAY;AAC/D,QAAM,gBAAgB,UAAU;AAChC,MAAI;AACF,UAAM,OAAO,YAAY,eAAe,mBAAmB,OAAO,MAAM;AACxE,QAAI,KAAK,WAAW,UAAW,OAAM,IAAI,iBAAiB,8CAA8C,GAAG;AAAA,EAC7G,UAAE;AACA,kBAAc,MAAM;AAAA,EACtB;AAEA,QAAM,cAAc,iBAAiB;AAAA,IACnC;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,aAAa,OAAO;AAAA,EACtB,CAAC;AACD,MAAI,CAAC,YAAY,MAAO,OAAM,IAAI,iBAAiB,wCAAwC,GAAG;AAC9F,QAAM,QAAQ,YAAY;AAE1B,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,QAAI,KAAK,WAAW,WAAW;AAC7B,wBAAkB,YAAY,WAAW;AACzC,YAAM,IAAI,iBAAiB,8CAA8C,GAAG;AAAA,IAC9E;AACA,UAAM,YAAY,OAAO;AACzB,UAAMF,YAAW,EAAE,GAAI,KAAK,YAAY,CAAC,GAAI,UAAU,MAAM,GAAG;AAChE,QAAI;AACF,kBAAY,UAAU,MAAM;AAC1B,cAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,SAI/B,EAAE,IAAI,WAAW,WAAWD,cAAaC,SAAQ,GAAG,KAAK,EAAE;AAC5D,sBAAc,QAAQ,4CAA4C;AAClE,QAAAE,aAAY,UAAU,KAAK,IAAI,WAAW,WAAW,yBAAyB,EAAE,UAAU,MAAM,GAAG,CAAC;AAAA,MACtG,CAAC;AAAA,IACH,SAAS,OAAO;AACd,wBAAkB,YAAY,WAAW;AACzC,YAAM;AAAA,IACR;AACA,WAAO;AAAA,MACL,GAAG,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,MACtD;AAAA,MACA,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,iBAAiB,SAAiB,QAA2E;AAC3H,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,mBAAmB,UAAU;AACnC,MAAI;AACF,UAAM,OAAO,YAAY,kBAAkB,mBAAmB,OAAO,MAAM;AAC3E,QAAI,KAAK,WAAW,UAAW,OAAM,IAAI,iBAAiB,8CAA8C,GAAG;AAAA,EAC7G,UAAE;AACA,qBAAiB,MAAM;AAAA,EACzB;AACA,QAAM,aAAa,2BAA2B;AAAA,IAC5C,YAAY,OAAO;AAAA,IACnB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,WAAW,GAAI,OAAM,IAAI,iBAAiB,WAAW,SAAS,GAAG;AACtE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,QAAI,KAAK,WAAW,UAAW,OAAM,IAAI,iBAAiB,8CAA8C,GAAG;AAC3G,QAAI,KAAK,uBAAuB,KAAK,wBAAwB,WAAW,MAAM,IAAI;AAChF,YAAM,IAAI,iBAAiB,8CAA8C,GAAG;AAAA,IAC9E;AACA,UAAM,YAAY,OAAO;AACzB,UAAMF,YAAW,EAAE,GAAI,KAAK,YAAY,CAAC,GAAI,UAAU,WAAW,MAAM,GAAG;AAC3E,gBAAY,UAAU,MAAM;AAC1B,YAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,OAI/B,EAAE,IAAI,WAAW,WAAWD,cAAaC,SAAQ,GAAG,KAAK,EAAE;AAC5D,oBAAc,QAAQ,4CAA4C;AAClE,MAAAE,aAAY,UAAU,KAAK,IAAI,WAAW,WAAW,MAAM,YAAY,yBAAyB,EAAE,UAAU,WAAW,MAAM,GAAG,CAAC;AAAA,IACnI,CAAC;AACD,iCAA6B,WAAW,OAAO;AAAA,MAC7C,aAAa;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,oBAAoB,SAAiB,QAKvB;AAC5B,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,QAAQ,eAAe,OAAO,OAAO,gBAAgB;AAC3D,QAAM,SAAS,OAAO,OAAO,KAAK;AAClC,MAAI,CAAC,OAAQ,OAAM,IAAI,iBAAiB,6BAA6B;AACrE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,QAAI,CAAC,CAAC,WAAW,aAAa,EAAE,SAAS,KAAK,MAAM,GAAG;AACrD,YAAM,IAAI,iBAAiB,wEAAwE,KAAK,MAAM,KAAK,GAAG;AAAA,IACxH;AACA,UAAM,YAAY,OAAO;AACzB,UAAM,eAAe,OAAO,iBAAiB,SAAY,KAAK,eAAgB,OAAO,aAAa,KAAK,KAAK;AAC5G,UAAMF,YAAW,qBAAqB,KAAK,QAAQ;AACnD,gBAAY,UAAU,MAAM;AAC1B,YAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK/B,EAAE,IAAI,gBAAgB,MAAM,WAAWD,cAAaC,SAAQ,GAAG,mBAAmB,KAAK,EAAE;AAC1F,oBAAc,QAAQ,4BAA4B,KAAK,EAAE,uBAAuB;AAChF,UAAI,KAAK,qBAAqB;AAC5B,mCAA2B,UAAU,mBAAmB,KAAK,qBAAqB;AAAA,UAChF;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,MAAAE,aAAY,UAAU,KAAK,IAAI,kBAAkB,OAAO,QAAQ;AAAA,QAC9D,mBAAmB,KAAK;AAAA,QACxB,iBAAiB,KAAK;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiB,QAAiH;AAClK,QAAM,oBAAoB,iBAAiB,OAAO;AAClD,QAAM,QAAQ,eAAe,OAAO,OAAO,cAAc;AACzD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,YAAY,UAAU,mBAAmB,OAAO,MAAM;AACnE,QAAI,KAAK,WAAW,YAAa,QAAO,EAAE,SAAS,mBAAmB,IAAI,MAAM,MAAM,QAAQ,WAAW,UAAU,KAAK,EAAE,EAAE;AAC5H,QAAI,CAAC,CAAC,WAAW,WAAW,aAAa,EAAE,SAAS,KAAK,MAAM,GAAG;AAChE,YAAM,IAAI,iBAAiB,qDAAqD,KAAK,MAAM,KAAK,GAAG;AAAA,IACrG;AACA,QAAI,KAAK,WAAW,aAAa,CAAC,OAAO,UAAU;AACjD,YAAM,IAAI,iBAAiB,6DAA6D,GAAG;AAAA,IAC7F;AACA,UAAM,uBAAuB,OAAO,aAAa,QAAQ,KAAK,WAAW;AACzE,UAAMF,YAAW,uBAAuB,qBAAqB,KAAK,QAAQ,IAAI,KAAK;AACnF,UAAM,YAAY,OAAO;AACzB,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,YAAY,uBAAuB,SAAY,KAAK;AAAA,MACpD,qBAAqB,uBAAuB,SAAY,KAAK;AAAA,MAC7D,YAAY,uBAAuB,SAAY,KAAK;AAAA,MACpD,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAAA;AAAA,IACF;AACA,QAAI,CAAC,OAAO,aAAc,QAAO,EAAE,SAAS,mBAAmB,IAAI,MAAM,QAAQ,MAAe,MAAM,eAAe,QAAQ,WAAW,UAAU,KAAK,EAAE,EAAE;AAC3J,gBAAY,UAAU,MAAM;AAC1B,YAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK/B,EAAE;AAAA,QACD;AAAA,QACA,uBAAuB,OAAO,KAAK,cAAc;AAAA,QACjD,uBAAuB,OAAO,KAAK,cAAc;AAAA,QACjD;AAAA,QACAD,cAAaC,SAAQ;AAAA,QACrB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,oBAAc,QAAQ,QAAQ,KAAK,MAAM,iBAAiB,KAAK,EAAE,sBAAsB;AACvF,UAAI,sBAAsB;AACxB,YAAI,KAAK,qBAAqB;AAC5B,qCAA2B,UAAU,mBAAmB,KAAK,qBAAqB;AAAA,YAChF;AAAA,YACA,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,QAAAE,aAAY,UAAU,KAAK,IAAI,kBAAkB,OAAO,6CAA6C;AAAA,UACnG,mBAAmB,KAAK;AAAA,UACxB,iBAAiB,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AACA,MAAAA,aAAY,UAAU,KAAK,IAAI,aAAa,OAAO,yBAAyB;AAAA,IAC9E,CAAC;AACD,WAAO,eAAe,UAAU,mBAAmB,KAAK,EAAE;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,mCAAmC,SAAiB,QAKpC;AAC9B,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI,OAAO,QAAQ,IAAI;AAC/D,SAAO,iBAAiB,SAAS,OAAO,aAAa,CAAC,SAAS,CAAC,EAAE,MAC/D,OAAO,UAAQ,KAAK,cAAc,SAAS,EAC3C,OAAO,UAAQ,CAAC,aAAa,UAAU,IAAI,KAAK,eAAe,CAAC,EAChE,IAAI,UAAQ,kBAAkB,SAAS;AAAA,IACtC,OAAO,OAAO;AAAA,IACd,cAAc,OAAO;AAAA,IACrB,QAAQ,KAAK;AAAA,EACf,CAAC,CAAC;AACN;;;AE7gBA,IAAM,SAAS,oBAAI,IAA2B,CAAC,SAAS,SAAS,QAAQ,CAAC;AAC1E,IAAM,WAAW,oBAAI,IAA4B,CAAC,UAAU,UAAU,UAAU,CAAC;AAE1E,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,iBAAiB;AAC1B;AAEO,SAAS,mBAAmB,SAAiB,aAA6B;AAC/E,SAAO,GAAG,OAAO,sBAAsB,WAAW;AACpD;AAEA,SAASI,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAASC,iBAAgB,OAA2C,UAA0D;AAC5H,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,SAAS,IAAI,MAAM,EAAG,OAAM,IAAI,sBAAsB,yCAAyC,MAAM,EAAE;AAC5G,SAAO;AACT;AAEA,SAASC,gBAAe,OAAiE;AACvF,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,OAAO,IAAI,KAAK,EAAG,OAAM,IAAI,sBAAsB,wCAAwC,KAAK,EAAE;AACvG,SAAO;AACT;AAEA,SAASC,cAAa,UAAwB,SAAiB,SAAgD;AAC7G,QAAM,MAAM,SAAS,QAAQ,8DAA8D,EAAE,IAAI,SAAS,OAAO;AACjH,MAAI,CAAC,IAAK,OAAM,IAAI,sBAAsB,0BAA0B,OAAO,IAAI,GAAG;AAClF,SAAO;AACT;AAEA,SAAS,eAAe,KAA4B;AAClD,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IAC/D,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,cAAc,UAAwB,SAAiB,IAAqC;AACnG,QAAM,MAAM,SAAS,QAAQ,kEAAkE,EAAE,IAAI,SAAS,EAAE;AAChH,SAAO,MAAM,eAAe,GAAG,IAAI;AACrC;AAEA,SAAS,gBAAgB,UAAwB,SAAiB,aAA8C;AAC9G,QAAM,MAAM,SAAS,QAAQ,6EAA6E,EAAE,IAAI,SAAS,WAAW;AACpI,SAAO,MAAM,eAAe,GAAG,IAAI;AACrC;AAEA,SAAS,WAAW,UAAwB,SAAyE;AACnH,QAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAU7B,EAAE,IAAI,SAAS,SAAS,SAAS,OAAO;AACzC,SAAO,KAAK,IAAI,UAAQ,EAAE,eAAe,IAAI,eAAe,aAAa,IAAI,eAAe,OAAU,EAAE;AAC1G;AAEA,SAAS,qBAAqB,UAAwB,SAAuB;AAC3E,EAAAH,eAAc,UAAU,OAAO;AAC/B,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQlC;AACD,aAAW,QAAQ,WAAW,UAAU,OAAO,GAAG;AAChD,cAAU;AAAA,MACR,mBAAmB,SAAS,KAAK,aAAa;AAAA,MAC9C;AAAA,MACA,KAAK,eAAe;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAAS,SAAS,UAAwB,SAAqC;AAC7E,SAAQ,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQxB,EAAE,IAAI,OAAO,EAAY,IAAI,cAAc;AAC9C;AAEA,SAAS,gBAAgB,UAAwB,SAA0C;AACzF,QAAM,MAAM,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAK5B,EAAE,IAAI,OAAO;AACd,SAAO,MAAM,eAAe,GAAG,IAAI;AACrC;AAEO,SAAS,sBAAsB,SAA2C;AAC/E,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,yBAAqB,UAAU,OAAO;AACtC,WAAO;AAAA,MACL;AAAA,MACA,kBAAkB,gBAAgB,UAAU,OAAO;AAAA,MACnD,YAAY,SAAS,UAAU,OAAO;AAAA,MACtC,WAAW,OAAO;AAAA,IACpB;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,wBAAwB,SAAiB,aAAuC;AAC9F,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,yBAAqB,UAAU,OAAO;AACtC,UAAM,YAAY,cAAc,UAAU,SAAS,WAAW,KAAK,gBAAgB,UAAU,SAAS,WAAW;AACjH,QAAI,CAAC,UAAW,OAAM,IAAI,sBAAsB,8BAA8B,WAAW,IAAI,GAAG;AAChG,WAAO;AAAA,EACT,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,uBAAuB,SAAiB,QAAgC;AACtF,QAAM,cAAc,OAAO,YAAY,KAAK;AAC5C,MAAI,CAAC,YAAa,OAAM,IAAI,sBAAsB,wCAAwC;AAC1F,QAAM,SAASC,iBAAgB,OAAO,QAAQ,QAAQ;AACtD,QAAM,QAAQC,gBAAe,OAAO,SAAS;AAC7C,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAOC,cAAa,UAAU,SAAS,WAAW;AACxD,UAAM,YAAY,OAAO;AACzB,UAAM,YAA8B;AAAA,MAClC,IAAI,mBAAmB,SAAS,WAAW;AAAA,MAC3C;AAAA,MACA,eAAe;AAAA,MACf,OAAO,OAAO,OAAO,KAAK,KAAK,GAAG,KAAK,KAAK;AAAA,MAC5C;AAAA,MACA,OAAO,OAAO,OAAO,KAAK,KAAK;AAAA,MAC/B,YAAY;AAAA,MACZ,WAAW,OAAO,aAAa,SAAS,WAAW,aAAa,YAAY;AAAA,MAC5E,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AACA,QAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,UAAU;AACvF,IAAAH,eAAc,UAAU,OAAO;AAC/B,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUhB,EAAE;AAAA,MACD,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU,SAAS;AAAA,MACnB,UAAU;AAAA,MACV,UAAU,aAAa;AAAA,MACvB,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,2BAA2B,UAAU,KAAK;AAAA,MACnD,WAAW,cAAc,UAAU,SAAS,UAAU,EAAE;AAAA,IAC1D;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,uBAAuB,SAAiB,aAAqB,QAAsC;AACjH,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,yBAAqB,UAAU,OAAO;AACtC,UAAM,UAAU,cAAc,UAAU,SAAS,WAAW,KAAK,gBAAgB,UAAU,SAAS,WAAW;AAC/G,QAAI,CAAC,QAAS,OAAM,IAAI,sBAAsB,8BAA8B,WAAW,IAAI,GAAG;AAC9F,UAAM,YAAY,OAAO;AACzB,UAAM,OAAyB;AAAA,MAC7B,GAAG;AAAA,MACH,OAAO,OAAO,OAAO,KAAK,KAAK,QAAQ;AAAA,MACvC,QAAQC,iBAAgB,OAAO,QAAQ,QAAQ,MAAM;AAAA,MACrD,OAAO,OAAO,UAAU,SAAY,QAAQ,QAAQ,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3E,WAAW,OAAO,WAAW,YAAY,QAAQ;AAAA,MACjD,YAAY;AAAA,IACd;AACA,QAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,WAAW,KAAK;AAC7F,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,MAAM,KAAK,aAAa,MAAM,WAAW,SAAS,QAAQ,EAAE;AAC1G,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,6BAA6B,KAAK,KAAK;AAAA,MAChD,WAAW,cAAc,UAAU,SAAS,QAAQ,EAAE;AAAA,IACxD;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,yBAAyB,SAAiB,aAAqB,cAAuB;AACpG,SAAO,uBAAuB,SAAS,aAAa,EAAE,UAAU,MAAM,QAAQ,UAAU,aAAa,CAAC;AACxG;AAEO,SAAS,wBAAwB,SAAiB,aAAqB,cAAuB;AACnG,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,yBAAqB,UAAU,OAAO;AACtC,UAAM,UAAU,cAAc,UAAU,SAAS,WAAW,KAAK,gBAAgB,UAAU,SAAS,WAAW;AAC/G,QAAI,CAAC,QAAS,OAAM,IAAI,sBAAsB,8BAA8B,WAAW,IAAI,GAAG;AAC9F,UAAM,YAAY,OAAO;AACzB,UAAM,OAAyB;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AACA,QAAI,CAAC,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,WAAW,KAAK;AACtF,uCAAmC,SAAS;AAAA,MAC1C,OAAO;AAAA,MACP,cAAc;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,WAAW,SAAS,QAAQ,EAAE;AACrC,aAAS,QAAQ,yEAAyE,EAAE,IAAI,SAAS,QAAQ,aAAa;AAC9H,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,8BAA8B,QAAQ,KAAK;AAAA,MACpD,WAAW,cAAc,UAAU,SAAS,QAAQ,EAAE;AAAA,IACxD;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,2BAA2B,SAAqC;AAC9E,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,yBAAqB,UAAU,OAAO;AACtC,WAAO,gBAAgB,UAAU,OAAO,GAAG;AAAA,EAC7C,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;AC7SA,SAASG,iBAAgB,MAAe,OAAyB;AAC/D,SAAO,CAAC,QAAQ,CAAC,SAAS,SAAS;AACrC;AAEA,SAAS,+BAA+B,SAAiB,UAAkB,SAA2B;AACpG,SAAO,gBAAgB,OAAO,EAAE,OAAO,KAAK,WAAS;AACnD,QAAI,MAAM,YAAY,WAAW,MAAM,WAAW,YAAY,MAAM,kBAAkB,UAAW,QAAO;AACxG,QAAI,MAAM,eAAe,oBAAqB,QAAO,MAAM,cAAc;AACzE,WAAO,MAAM,eAAe,qBAAqBA,iBAAgB,SAAS,MAAM,OAAO;AAAA,EACzF,CAAC;AACH;AAEO,SAAS,qCAAqC,QAO5C;AACP,MAAI,CAAC,OAAO,aAAc;AAC1B,QAAM,WAAW,mBAAmB,OAAO,SAAS,OAAO,WAAW;AACtE,MAAI,CAAC,OAAO,cAAc,CAAC,+BAA+B,OAAO,SAAS,UAAU,OAAO,OAAO,EAAG;AACrG,QAAM,aAAa,2BAA2B;AAAA,IAC5C,SAAS,OAAO;AAAA,IAChB,YAAY,OAAO;AAAA,IACnB,cAAc,OAAO;AAAA,IACrB,aAAa;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,WAAW;AAAA,IACX;AAAA,IACA,WAAW,OAAO;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,WAAW,IAAI;AAClB,UAAM,SAAS,WAAW,SAAS,oBAAoB,WAAW,SAAS,wBAAwB,MAAM;AACzG,UAAM,IAAI,gBAAgB,WAAW,SAAS,QAAQ,WAAW,MAAM,WAAW,SAAS;AAAA,EAC7F;AACF;;;ALVO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,eAAe,OAAuC;AACpE,SAAO,iBAAiB;AAC1B;AAEA,SAAS,cAAc,SAAiB,QAA4C;AAClF,QAAM,QAAQ,WAAW,SAAS,EAAE,QAAQ,MAAM,GAAG,UAAU,IAAI,CAAC;AACpE,QAAM,SAAS,CAAC,GAAG,MAAM,MAAM;AAC/B,WAAS,OAAO,GAAG,QAAQ,MAAM,WAAW,YAAY,QAAQ,GAAG;AACjE,WAAO,KAAK,GAAG,WAAW,SAAS,EAAE,QAAQ,MAAM,UAAU,IAAI,CAAC,EAAE,MAAM;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,cAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAASC,MAAK,UAAU,SAAS,UAAU,cAAc,GAAG,WAAW,SAAS;AAClG;AAEA,SAAS,YAAY,UAAwB,SAAiB,OAA0B;AACtF,QAAM,YAAY,OAAO;AACzB,QAAM,SAAS,MAAM,WAAW,UAAU,UAAU;AACpD,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWhB,EAAE;AAAA,IACD,MAAM;AAAA,IAAU;AAAA,IAAS;AAAA,IAAQ,MAAM,OAAO,iBAAiB;AAAA,IAAM,MAAM,IAAI,OAAO;AAAA,IACtF,MAAM,OAAO,mBAAmB,MAAM,IAAI,mBAAmB;AAAA,IAAM,MAAM;AAAA,IAAc,MAAM;AAAA,IAC7F,MAAM;AAAA,IAAQ,MAAM,WAAW;AAAA,IAAM,MAAM,YAAY;AAAA,IAAM,MAAM,YAAY;AAAA,IAC/E,MAAM,OAAO,cAAc,MAAM,IAAI,cAAc;AAAA,IAAM,MAAM,OAAO,gBAAgB,MAAM,IAAI,gBAAgB;AAAA,IAChH;AAAA,IAAW;AAAA,IAAW;AAAA,EACxB;AACA,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,MAAM,UAAU,SAAS;AAClC;AAEO,SAAS,mBAAmB,UAAU,gBAAqC;AAChF,QAAM,WAAW,UAAG;AACpB,QAAM,UAAU,cAAc,SAAS,SAAS;AAChD,QAAM,QAAQ,cAAc,SAAS,OAAO;AAC5C,gBAAc,UAAU,OAAO;AAC/B,aAAW,SAAS,CAAC,GAAG,SAAS,GAAG,KAAK,EAAG,aAAY,UAAU,SAAS,KAAK;AAChF,WAAS,MAAM;AACf,SAAO,EAAE,SAAS,QAAQ,QAAQ,OAAO,MAAM,QAAQ,OAAO,QAAQ,SAAS,MAAM,QAAQ,UAAU,cAAc,EAAE;AACzH;AAEA,SAASC,cAAa,UAAwB,SAAiB,SAAuB;AACpF,QAAM,MAAM,SAAS,QAAQ,uDAAuD,EAAE,IAAI,SAAS,OAAO;AAC1G,MAAI,CAAC,IAAK,OAAM,IAAI,aAAa,0BAA0B,OAAO,IAAI,GAAG;AAC3E;AAEA,SAAS,SAAS,UAAwB,SAAiB,SAAqC;AAC9F,QAAM,MAAM,SAAS,QAAQ,iHAAiH,EAAE,IAAI,SAAS,OAAO;AACpK,SAAO,KAAK;AACd;AAEA,SAAS,QAAQ,UAAwB,SAAiB,SAAyB;AACjF,MAAI,OAAO;AACX,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,CAAC,KAAK,IAAI,IAAI,GAAG;AACtB,SAAK,IAAI,IAAI;AACb,UAAM,SAAS,SAAS,UAAU,SAAS,IAAI;AAC/C,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAwB,SAAiB,MAAoB;AACxF,EAAAA,cAAa,UAAU,SAAS,IAAI;AACpC,QAAM,gBAAgB,QAAQ,UAAU,SAAS,IAAI;AACrD,MAAI,kBAAkB,KAAM,OAAM,IAAI,aAAa,SAAS,IAAI,0BAA0B,GAAG;AAC/F;AAEA,SAAS,sBAAsB,UAAwB,SAAiB,SAAqC;AAC3G,QAAM,MAAM,SAAS,QAAQ;AAAA;AAAA;AAAA,GAG5B,EAAE,IAAI,SAAS,OAAO;AACvB,SAAO,KAAK;AACd;AAEA,SAAS,qBAAqB,UAAwB,SAAiB,SAAyB;AAC9F,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,CAAC,KAAK,IAAI,OAAO,GAAG;AACzB,SAAK,IAAI,OAAO;AAChB,UAAM,WAAW,sBAAsB,UAAU,SAAS,OAAO;AACjE,QAAI,SAAU,QAAO;AACrB,UAAM,SAAS,SAAS,UAAU,SAAS,OAAO;AAClD,QAAI,CAAC,OAAQ,QAAO;AACpB,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAAwB,SAAiB,SAAqC;AAClG,QAAM,MAAM,SAAS,QAAQ,4DAA4D,EAAE,IAAI,SAAS,OAAO;AAC/G,SAAO,KAAK;AACd;AAEA,SAAS,yBAAyB,UAAwB,SAAiB,SAA4D;AACrI,SAAO;AAAA,IACL,SAAS,aAAa,UAAU,SAAS,OAAO;AAAA,IAChD,aAAa,qBAAqB,UAAU,SAAS,OAAO;AAAA,EAC9D;AACF;AAEO,SAAS,4BAA4B,SAAiB,SAA4D;AACvH,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,IAAAA,cAAa,UAAU,SAAS,OAAO;AACvC,WAAO,yBAAyB,UAAU,SAAS,OAAO;AAAA,EAC5D,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,mBAAmB,UAAwB,SAAqC;AACvF,QAAM,MAAM,SAAS,QAAQ,mGAAmG,EAAE,IAAI,OAAO;AAC7I,SAAO,KAAK;AACd;AAEA,SAAS,YAAY,UAAwB,SAAiB,aAA8B;AAC1F,MAAI,aAAa;AACf,IAAAA,cAAa,UAAU,SAAS,WAAW;AAC3C,WAAO;AAAA,EACT;AACA,QAAM,OAAO,2BAA2B,OAAO,KAAK,mBAAmB,UAAU,OAAO;AACxF,MAAI,CAAC,KAAM,OAAM,IAAI,aAAa,mEAAmE;AACrG,EAAAA,cAAa,UAAU,SAAS,IAAI;AACpC,SAAO;AACT;AAEA,SAAS,OAAO,SAAiB,QAAgB,OAAuB;AACtE,SAAO,GAAG,OAAO,IAAI,MAAM,iBAAiB,KAAK;AACnD;AAEA,SAAS,gBAAgB,SAAiB,MAAc,MAAc,WAA2B;AAC/F,SAAO,GAAG,OAAO,IAAI,IAAI,WAAW,IAAI,IAAI,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC;AACjF;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,kBAAkB,KAAoD;AAC7E,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,QAAQ,IAAI;AAAA,IACZ,cAAc,IAAI;AAAA,IAClB,OAAO,UAAU,IAAI,KAAK;AAAA,IAC1B,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,aAAa,UAAU,IAAI,WAAW;AAAA,EACxC;AACF;AAEA,SAAS,cAAc,OAAuF;AAC5G,QAAM,WAAW,oBAAI,IAAgE;AACrF,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,cAAc,aAAa,KAAK,cAAc,SAAU;AACjE,UAAM,WAAW,SAAS,IAAI,KAAK,eAAe,KAAK,CAAC;AACxD,aAAS,KAAK,SAAS,IAAI;AAC3B,aAAS,IAAI,KAAK,iBAAiB,QAAQ;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAA+B,MAA0C;AAC/F,SAAO,OAAO,EAAE,GAAG,SAAS,SAAS,KAAK,IAAI,KAAK,IAAI;AACzD;AAEA,SAAS,wBAAwB,SAAiB,aAAqB,MAAyC;AAC9G,SAAO;AAAA,IACL,IAAI,GAAG,KAAK,EAAE;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe,KAAK;AAAA,IACpB,QAAQ;AAAA,IACR,cAAc,KAAK;AAAA,IACnB,OAAO,KAAK;AAAA,IACZ,YAAY,KAAK;AAAA,IACjB,SAAS,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAA8C;AACjE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,QAAQ,IAAI;AAAA,IACZ,QAAQ,UAAU,IAAI,MAAM;AAAA,IAC5B,mBAAmB,UAAU,IAAI,iBAAiB;AAAA,IAClD,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,iBAAiB,UAAU,IAAI,eAAe;AAAA,IAC9C,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,aAAa,UAAU,IAAI,WAAW;AAAA,IACtC,YAAY,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,EAC5C;AACF;AAEA,SAAS,gBAAgB,KAAsH,YAAY,MAAsB;AAC/K,QAAM,YAAY,IAAI,oBAAoB,OAAO;AACjD,SAAO;AAAA,IACL,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI,QAAQ;AAAA,IAClC,YAAY,IAAI;AAAA,IAChB,eAAe,IAAI;AAAA,IACnB,UAAU,IAAI;AAAA,IACd,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,WAAW,IAAI;AAAA,IACf,iBAAiB,IAAI;AAAA,IACrB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AAEA,SAAS,oBAAoB,kBAAoC,KAAwI;AACvM,MAAI,iBAAiB,KAAK,aAAW,QAAQ,WAAW,SAAS,EAAG,QAAO;AAC3E,SAAO,CAAC,GAAG,kBAAkB,gBAAgB,KAAK,CAAC,iBAAiB,KAAK,aAAW,QAAQ,UAAU,CAAC,CAAC;AAC1G;AAEA,SAAS,iBAAiB,UAAwB,SAAiB,MAAc,MAAoB;AACnG,sBAAoB,UAAU,SAAS,IAAI;AAC3C,EAAAA,cAAa,UAAU,SAAS,IAAI;AACpC,QAAM,WAAW,QAAQ,UAAU,SAAS,IAAI;AAChD,MAAI,aAAa,KAAM,OAAM,IAAI,aAAa,SAAS,IAAI,gCAAgC,IAAI,EAAE;AACnG;AAUA,SAAS,kBAAkB,WAAmB,WAA6B;AACzE,SAAO,QAAQ,aAAa,CAAC,SAAS,SAAS,KAAK,EAAE,SAAS,SAAS,CAAC;AAC3E;AAEA,SAAS,gBAAgB,SAAiB,WAAwC;AAChF,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,IAAI,gBAAgB,EAAE,SAAS,MAAM,UAAU,CAAC;AAC/D,SAAO,6BAA6B,OAAO,SAAS,CAAC;AACvD;AAEO,SAAS,kBAAkB,SAAiB,QAA2B;AAC5E,QAAM,WAAW,UAAG;AACpB,EAAAC,cAAa,UAAU,SAAS,OAAO,aAAa;AACpD,EAAAA,cAAa,UAAU,SAAS,OAAO,YAAY;AACnD,MAAI,OAAO,kBAAkB,OAAO,aAAc,OAAM,IAAI,aAAa,qCAAqC;AAC9G,QAAM,eAAe,yBAAyB,UAAU,SAAS,OAAO,aAAa;AACrF,MAAI;AACF,yCAAqC;AAAA,MACnC,SAAS,aAAa;AAAA,MACtB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB;AAAA,MACA,aAAa,aAAa;AAAA,MAC1B,WAAW;AAAA,IACb,CAAC;AAAA,EACH,SAAS,OAAO;AACd,aAAS,MAAM;AACf,UAAM;AAAA,EACR;AACA,QAAM,OAAO;AAAA,IACX,IAAI,OAAO,SAAS,OAAO,eAAe,OAAO,YAAY;AAAA,IAAG,iBAAiB,OAAO;AAAA,IACxF,gBAAgB,OAAO;AAAA,IAAc,eAAe;AAAA,IAAyB,YAAY,OAAO;AAAA,EAClG;AACA,MAAI,CAAC,OAAO,cAAc;AACxB,aAAS,MAAM;AACf,WAAO,EAAE,IAAI,MAAe,QAAQ,MAAM,KAAK;AAAA,EACjD;AACA,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK,iBAAiB,KAAK,gBAAgB,KAAK,UAAU;AACnF,WAAS,MAAM;AACf,SAAO,EAAE,IAAI,MAAe,SAAS,UAAU,KAAK,cAAc,SAAS,KAAK,eAAe,IAAI,KAAK;AAC1G;AAEA,SAAS,YAAY,UAAwB,SAAiB,MAA6B;AACzF,QAAM,QAAuB,CAAC;AAC9B,QAAM,QAAQ,CAAC,IAAI;AACnB,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,SAAS,MAAM,MAAM;AAC3B,QAAI,KAAK,IAAI,MAAM,EAAG;AACtB,SAAK,IAAI,MAAM;AACf,UAAM,OAAO,SAAS,QAAQ,yJAAyJ,EAAE,IAAI,SAAS,MAAM;AAC5M,UAAM,KAAK,GAAG,IAAI;AAClB,UAAM,KAAK,GAAG,KAAK,IAAI,SAAO,IAAI,cAAc,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,SAAiB,SAAkC;AACpF,QAAM,WAAW,UAAG;AACpB,EAAAA,cAAa,UAAU,SAAS,OAAO;AACvC,QAAM,OAAO,sBAAsB,UAAU,SAAS,OAAO,KAAK,QAAQ,UAAU,SAAS,OAAO;AACpG,QAAM,QAAQ,YAAY,UAAU,SAAS,IAAI;AACjD,QAAM,WAAW,aAAa,UAAU,SAAS,IAAI;AACrD,QAAM,QAAQ,iBAAiB,SAAS,IAAI,EAAE;AAC9C,QAAM,MAAM,CAAC,GAAG,oBAAI,IAAI;AAAA,IACtB;AAAA,IACA,GAAG,MAAM,QAAQ,UAAQ,CAAC,KAAK,iBAAiB,KAAK,cAAc,CAAC;AAAA,IACpE,GAAG,SAAS,IAAI,SAAO,IAAI,QAAQ;AAAA,IACnC,GAAG,MAAM,IAAI,UAAQ,KAAK,eAAe;AAAA,EAC3C,CAAC,CAAC;AACF,QAAMC,gBAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,QAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMUA,aAAY;AAAA,GACnD,EAAE,IAAI,MAAM,SAAS,GAAG,GAAG;AAC5B,QAAM,cAAc,IAAI,SAAS,IAC7B,SAAS,QAAQ,2EAA2EA,aAAY,8CAA8C,EAAE,IAAI,SAAS,GAAG,GAAG,IAC3K,CAAC;AACL,QAAM,iBAAiB,oBAAI,IAA8B;AACzD,aAAW,WAAW,YAAY,IAAI,WAAW,GAAG;AAClD,mBAAe,IAAI,QAAQ,eAAe,CAAC,GAAI,eAAe,IAAI,QAAQ,aAAa,KAAK,CAAC,GAAI,OAAO,CAAC;AAAA,EAC3G;AACA,QAAM,qBAAqB,cAAc,KAAK;AAC9C,QAAM,aAAa,IAAI,SAAS,IAC5B,SAAS,QAAQ,+HAA+HA,aAAY,uBAAuB,EAAE,IAAI,SAAS,MAAM,GAAG,GAAG,IAC9M,CAAC;AACL,QAAM,gBAAgB,IAAI,IAAI,WAAW,IAAI,SAAO;AAClD,UAAM,UAAU,kBAAkB,GAAG;AACrC,WAAO,CAAC,QAAQ,eAAe,eAAe,SAAS,mBAAmB,IAAI,QAAQ,aAAa,GAAG,MAAM,CAAC;AAAA,EAC/G,CAAC,CAAC;AACF,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,UAAQ,KAAK,eAAe,CAAC;AAChE,QAAM,cAAc,IAAI,IAAI,SAAS,IAAI,SAAO,IAAI,QAAQ,CAAC;AAC7D,QAAM,aAAa,SAAS,IAAI,UAAQ;AAAA,IACtC,UAAU,IAAI;AAAA,IAAU,OAAO,IAAI,SAAS;AAAA,IAC5C,UAAU,OAAO,IAAI,YAAY,CAAC;AAAA,IAAG,aAAa,IAAI;AAAA,EACxD,EAAE;AACF,QAAM,YAAY,WAAW,CAAC,KAAK;AACnC,QAAM,QAAQ,KAAK,IAAI,SAAO;AAC5B,UAAM,WAAwC,OAAO,IAAI,aAAa,YAAY,OAAO,IAAI,aAAa,WAAW,EAAE,GAAG,IAAI,UAAU,GAAG,IAAI,SAAS,IAAI;AAC5J,UAAM,EAAE,kBAAkB,iBAAiB,UAAU,UAAU,UAAU,UAAU,GAAG,KAAK,IAAI;AAC/F,UAAM,gBAAgB,WAAW,KAAK,UAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5E,UAAM,WAAW,oBAAoB,eAAe,IAAI,IAAI,QAAQ,KAAK,CAAC,GAAG,GAAG;AAChF,UAAM,iBAAiB,SAAS,KAAK,aAAW,QAAQ,UAAU,KAAK,SAAS,CAAC;AACjF,UAAM,cAAc,gBAAgB,aAAa,IAAI;AACrD,UAAM,eAAe,mBAAmB,IAAI,IAAI,QAAQ;AACxD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,eAAe,SAAS;AAAA,MACxB,iBAAiB;AAAA,MACjB,WAAW,CAAC,SAAS,IAAI,IAAI,QAAQ;AAAA,MACrC,eAAe,gBAAgB,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe;AAAA,MACrF;AAAA,MACA,aAAa,kBAAkB,IAAI,YAAY,WAAW,IAAI,gBAAgB,SAAS,WAAW,IAAI;AAAA,MACtG,gBAAgB,cAAc,IAAI,IAAI,QAAQ;AAAA,MAC9C,gBAAgB,eAAe;AAAA,MAC/B,eAAe,YAAY,IAAI,IAAI,QAAQ;AAAA,IAC7C;AAAA,EACF,CAAC;AACD,WAAS,MAAM;AACf,SAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,UAAU,WAAW,IAAI,SAAO,IAAI,QAAQ;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,OAAO,UAAQ,KAAK,SAAS,EAAE,IAAI,UAAQ,KAAK,QAAQ;AAAA,IACtE;AAAA,IACA;AAAA,IACA,WAAW,OAAO;AAAA,EACpB;AACF;AAEO,SAAS,oBAAoB,SAAiB,QAA6B;AAChF,MAAI,OAAO,UAAU,WAAW,EAAG,OAAM,IAAI,aAAa,+CAA+C;AACzG,QAAM,WAAW,UAAG;AACpB,EAAAD,cAAa,UAAU,SAAS,OAAO,WAAW;AAClD,aAAW,YAAY,OAAO,UAAW,CAAAA,cAAa,UAAU,SAAS,SAAS,OAAO;AACzF,MAAI;AACF,yCAAqC;AAAA,MACnC,SAAS,aAAa,UAAU,SAAS,OAAO,WAAW;AAAA,MAC3D,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,WAAW;AAAA,IACb,CAAC;AAAA,EACH,SAAS,OAAO;AACd,aAAS,MAAM;AACf,UAAM;AAAA,EACR;AACA,MAAI,CAAC,OAAO,cAAc;AACxB,aAAS,MAAM;AACf,WAAO,EAAE,IAAI,MAAe,QAAQ,MAAM,eAAe,OAAO,aAAa,WAAW,OAAO,UAAU;AAAA,EAC3G;AACA,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKlC;AACD,aAAW,YAAY,OAAO,WAAW;AACvC,cAAU,IAAI,GAAG,OAAO,IAAI,OAAO,WAAW,WAAW,SAAS,OAAO,IAAI,SAAS,OAAO,aAAa,SAAS,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS;AAAA,EAC/J;AACA,WAAS,MAAM;AACf,SAAO,EAAE,IAAI,MAAe,SAAS,SAAS,OAAO,UAAU,MAAM,sBAAsB,eAAe,OAAO,aAAa,WAAW,OAAO,UAAU;AAC5J;AAEO,SAAS,oBAAoB,SAAiB,aAA2C;AAC9F,QAAM,WAAW,UAAG;AACpB,QAAM,OAAO,YAAY,UAAU,SAAS,WAAW;AACvD,WAAS,MAAM;AACf,QAAM,WAAW,mBAAmB,SAAS,IAAI;AACjD,QAAM,uBAAuB,SAAS,SAAS,CAAC,GAAG,OAAO,UAAQ,KAAK,cAAc,aAAa,KAAK,WAAW,SAAS;AAC3H,QAAM,0BAA0B;AAAA,IAC9B,GAAG,SAAS,WACT,IAAI,eAAa,UAAU,QAAQ,EACnC,OAAO,aAAW,oBAAoB,KAAK,UAAQ,KAAK,oBAAoB,OAAO,CAAC;AAAA,IACvF,GAAG,oBACA,IAAI,UAAQ,KAAK,eAAe,EAChC,OAAO,aAAW,CAAC,SAAS,WAAW,KAAK,eAAa,UAAU,aAAa,OAAO,CAAC;AAAA,EAC7F;AACA,QAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,uBAAuB,CAAC;AAC5D,QAAM,cAAc,gBAAgB,SAAS,IAAI,kBAAkB,SAAS;AAC5E,QAAM,gBAAgB,YACnB,IAAI,aAAW,SAAS,MAAM,KAAK,UAAQ,KAAK,aAAa,OAAO,CAAC,EACrE,OAAO,CAAC,SAA8B,QAAQ,IAAI,CAAC;AACtD,QAAM,iBAAiB,gBAAgB,IAAI,CAAC,SAAS,aAAa;AAChE,UAAM,OAAO,oBAAoB,KAAK,UAAQ,KAAK,oBAAoB,OAAO;AAC9E,WAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO,MAAM;AAAA,MACb;AAAA,MACA,aAAa,MAAM,cAAc,OAAO;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,QAAM,oBAAoB,eAAe,SAAS,IAAI,eAAe,CAAC,IAAI,SAAS;AACnF,QAAM,qBAAqB,eAAe,SAAS,IAAI,iBAAiB,SAAS;AACjF,QAAM,cAAc,SAAS,MAAM,OAAO,UAAQ,SAAS,OAAO,SAAS,KAAK,QAAQ,CAAC;AACzF,QAAM,WAAqB,CAAC;AAC5B,aAAW,gBAAgB,eAAe;AACxC,QAAI,aAAa,UAAW;AAC5B,aAAS,KAAK,gGAAgG;AAAA,EAChH;AACA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,eAAe,SAAS;AAAA,MACxB,UAAU;AAAA,MACV,gBAAgB,cAAc,SAAS,IAAI,aAAa;AAAA,MACxD,oBAAoB;AAAA,MACpB,QAAQ;AAAA,MACR,YAAY,cAAc,CAAC;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,SAAS;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AACA,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,eAAe,SAAS;AAAA,MACxB,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,QAAQ;AAAA,MACR,YAAY,YAAY,CAAC;AAAA,MACzB,aAAa,CAAC,YAAY,CAAC,CAAC;AAAA,MAC5B,QAAQ,SAAS;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,eAAe,SAAS;AAAA,IACxB,UAAU,YAAY,SAAS,IAAI,qBAAqB;AAAA,IACxD,gBAAgB;AAAA,IAChB,oBAAoB,YAAY,SAAS,IAAI,qBAAqB;AAAA,IAClE,QAAQ,YAAY,SAAS,IAAI,iCAAiC;AAAA,IAClE,YAAY;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,QAAQ,SAAS;AAAA,IACjB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA,WAAW,OAAO;AAAA,EACpB;AACF;AAEO,SAAS,mBAAmB,SAAiB,eAAgD;AAClG,QAAM,WAAW,mBAAmB,SAAS,aAAa;AAC1D,QAAM,QAAQ,SAAS,MAAM,OAAO,UAAQ,KAAK,oBAAoB,aAAa;AAClF,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,UAAQ,KAAK,cAAc,CAAC;AAC/D,SAAO;AAAA,IACL;AAAA,IAAS,iBAAiB;AAAA,IAC1B,UAAU,SAAS,MAAM,OAAO,UAAQ,SAAS,IAAI,KAAK,QAAQ,CAAC;AAAA,IACnE;AAAA,IAAO,WAAW,OAAO;AAAA,EAC3B;AACF;AAEO,SAAS,0BAA0B,SAAiB,aAAoD;AAC7G,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,wBAAoB,UAAU,SAAS,WAAW;AAClD,UAAM,cAAc,iBAAiB,SAAS,WAAW,EAAE,MAAM,OAAO,UAAQ,KAAK,cAAc,QAAQ;AAC3G,UAAM,qBAAqB,iBAAiB,SAAS,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,UAAQ,KAAK,cAAc,QAAQ;AAC/H,UAAM,qBAAqB,IAAI,IAAI,YAAY,IAAI,UAAQ,CAAC,KAAK,iBAAiB,IAAI,CAAC,CAAC;AACxF,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI7B,EAAE,IAAI,SAAS,WAAW;AAC3B,UAAM,WAAW,KAAK,IAAI,SAAO;AAC/B,YAAM,UAAU,kBAAkB,GAAG;AACrC,aAAO,eAAe,SAAS,mBAAmB,IAAI,QAAQ,aAAa,CAAC;AAAA,IAC9E,CAAC;AACD,UAAM,gBAAgB,IAAI,IAAI,SAAS,IAAI,aAAW,QAAQ,aAAa,CAAC;AAC5E,eAAW,QAAQ,oBAAoB;AACrC,UAAI,CAAC,cAAc,IAAI,KAAK,eAAe,EAAG,UAAS,KAAK,wBAAwB,SAAS,aAAa,IAAI,CAAC;AAAA,IACjH;AACA,WAAO,EAAE,SAAS,eAAe,aAAa,UAAU,WAAW,OAAO,EAAE;AAAA,EAC9E,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB,SAAiB,aAAqB,aAA8C;AACrH,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,qBAAiB,UAAU,SAAS,aAAa,WAAW;AAC5D,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI7B,EAAE,IAAI,SAAS,WAAW;AAC3B,UAAM,QAAQ,SAAS,QAAQ,8IAA8I,EAAE,IAAI,SAAS,WAAW;AACvM,WAAO,EAAE,SAAS,eAAe,aAAa,eAAe,aAAa,UAAU,oBAAoB,KAAK,IAAI,WAAW,GAAG,KAAK,GAAG,WAAW,OAAO,EAAE;AAAA,EAC7J,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,sBAAsB,SAAiB,QAKnB;AAClC,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,qBAAiB,UAAU,SAAS,OAAO,aAAa,OAAO,WAAW;AAC1E,UAAM,QAAQ,SAAS,QAAQ,8IAA8I,EAAE,IAAI,SAAS,OAAO,WAAW;AAC9M,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI7B,EAAE,IAAI,SAAS,OAAO,WAAW;AAClC,UAAM,WAAW,oBAAoB,KAAK,IAAI,WAAW,GAAG,KAAK;AACjE,UAAM,SAAS,SAAS,KAAK,CAAAE,aAAWA,SAAQ,OAAO,OAAO,SAAS;AACvE,QAAI,CAAC,OAAQ,OAAM,IAAI,aAAa,WAAW,OAAO,SAAS,cAAc,OAAO,WAAW,IAAI,GAAG;AACtG,UAAM,YAAY,OAAO;AACzB,UAAM,kBAAkB,EAAE,GAAG,QAAQ,YAAY,MAAM,aAAa,UAAU;AAC9E,QAAI,CAAC,OAAO,cAAc;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB,SAAS;AAAA,QACT,UAAU,SAAS,IAAI,CAAAA,cAAY,EAAE,GAAGA,UAAS,YAAYA,SAAQ,OAAO,OAAO,IAAI,aAAaA,SAAQ,OAAO,OAAO,KAAK,YAAYA,SAAQ,YAAY,EAAE;AAAA,QACjK,WAAW;AAAA,MACb;AAAA,IACF;AACA,aAAS,KAAK,iBAAiB;AAC/B,QAAI;AACF,eAAS,QAAQ,qFAAqF,EAAE,IAAI,SAAS,OAAO,WAAW;AACvI,UAAI,OAAO,WAAW,WAAW;AAC/B,cAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,SAI/B,EAAE,IAAI,WAAW,SAAS,OAAO,aAAa,OAAO,EAAE;AACxD,YAAI,OAAO,YAAY,EAAG,OAAM,IAAI,aAAa,WAAW,OAAO,SAAS,cAAc,OAAO,WAAW,IAAI,GAAG;AAAA,MACrH;AACA,eAAS,KAAK,QAAQ;AAAA,IACxB,SAAS,OAAO;AACd,eAAS,KAAK,UAAU;AACxB,YAAM;AAAA,IACR;AACA,UAAM,gBAAgB,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAItC,EAAE,IAAI,SAAS,OAAO,WAAW;AAClC,UAAM,oBAAoB,oBAAoB,cAAc,IAAI,WAAW,GAAG,KAAK;AACnF,UAAM,UAAU,kBAAkB,KAAK,UAAQ,KAAK,OAAO,OAAO,EAAE,KAAK;AACzE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,eAAe,OAAO;AAAA,MACtB,eAAe,OAAO;AAAA,MACtB;AAAA,MACA,UAAU;AAAA,MACV,WAAW,OAAO;AAAA,IACpB;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAuEO,SAAS,yBAAyB,SAAiB,QAA+K;AACvO,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,qBAAiB,UAAU,SAAS,OAAO,aAAa,OAAO,WAAW;AAC1E,UAAM,WAAW,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIjC,EAAE,IAAI,SAAS,OAAO,aAAa,OAAO,WAAW;AACtD,UAAM,YAAY,OAAO;AACzB,UAAM,UAAgC,WAAW;AAAA,MAC/C,GAAG,kBAAkB,QAAQ;AAAA,MAC7B,OAAO,OAAO,SAAS,kBAAkB,QAAQ,EAAE;AAAA,MACnD,cAAc,OAAO,eAAe,kBAAkB,QAAQ,EAAE;AAAA,IAClE,IAAI;AAAA,MACF,IAAI,gBAAgB,SAAS,OAAO,aAAa,OAAO,aAAa,SAAS;AAAA,MAC9E,YAAY;AAAA,MACZ,eAAe,OAAO;AAAA,MACtB,eAAe,OAAO;AAAA,MACtB,QAAQ;AAAA,MACR,cAAc,OAAO,eAAe;AAAA,MACpC,OAAO,OAAO;AAAA,MACd,YAAY;AAAA,IACd;AACA,QAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ;AACnE,UAAM,aAAa,kBAAkB,SAAS;AAAA,MAC5C,WAAW,QAAQ;AAAA,MACnB,cAAc,QAAQ;AAAA,MACtB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,UAAU;AACZ,eAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,OAIhB,EAAE,IAAI,QAAQ,cAAc,QAAQ,SAAS,MAAM,QAAQ,EAAE;AAAA,IAChE,OAAO;AACL,eAAS,QAAQ;AAAA;AAAA;AAAA,OAGhB,EAAE,IAAI,QAAQ,IAAI,SAAS,OAAO,aAAa,OAAO,aAAa,QAAQ,cAAc,QAAQ,SAAS,MAAM,QAAQ,UAAU;AAAA,IACrI;AACA,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMhB,EAAE,IAAI,OAAO,aAAa,WAAW,QAAQ,SAAS,MAAM,SAAS;AACtE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,eAAe,kBAAkB,SAAS,QAAQ,kDAAkD,EAAE,IAAI,QAAQ,EAAE,CAA4B,GAAG,WAAW,IAAI;AAAA,MAC3K,SAAS,WAAW,KAAK;AAAA,MACzB,MAAM,WAAW;AAAA,IACnB;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,0BAA0B,SAAiB,QAAmH;AAC5K,QAAM,WAAW,UAAG;AACpB,MAAI;AACF,qBAAiB,UAAU,SAAS,OAAO,aAAa,OAAO,WAAW;AAC1E,UAAM,WAAW,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIjC,EAAE,IAAI,SAAS,OAAO,aAAa,OAAO,WAAW;AACtD,QAAI,CAAC,SAAU,OAAM,IAAI,aAAa,kCAAkC,OAAO,WAAW,IAAI,GAAG;AACjG,UAAM,YAAY,OAAO;AACzB,UAAM,UAAU,EAAE,GAAG,kBAAkB,QAAQ,GAAG,QAAQ,aAAsB,aAAa,UAAU;AACvG,QAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ;AACnE,UAAM,OAAO,iBAAiB,SAAS,OAAO,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,UAAQ,KAAK,cAAc,YAAY,KAAK,oBAAoB,OAAO,WAAW;AACrK,UAAM,gBAAgB,OAAO,kBAAkB,SAAS;AAAA,MACtD,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC,EAAE,OAAO;AACV,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,WAAW,QAAQ,EAAE;AAC5B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,eAAe,SAAS,aAAa;AAAA,MAC9C,SAAS,eAAe;AAAA,MACxB,MAAM;AAAA,IACR;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,oBAAoB,SAAiB,QAAyB;AAC5E,QAAM,WAAW,UAAG;AACpB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,eAAe,oBAAI,IAAgC;AACzD,MAAI;AACF,oBAAgB,wBAAwB,MAAM;AAC9C,WAAO,OAAO,gBAAgB,cAAc,CAAC,IAAI,QAAQ,UAAU,SAAS,cAAc,CAAC,CAAC,IAAI;AAChG,QAAI,CAAC,KAAM,OAAM,IAAI,aAAa,2CAA2C;AAC7E,IAAAC,cAAa,UAAU,SAAS,IAAI;AACpC,eAAW,WAAW,cAAe,CAAAA,cAAa,UAAU,SAAS,OAAO;AAC5E,WAAO,OAAO,QAAQ;AACtB,YAAQ,OAAO,iBAAiB;AAChC,QAAI,CAAC,OAAO,cAAc;AACxB,aAAO,EAAE,IAAI,MAAe,QAAQ,MAAM,eAAe,MAAM,WAAW,eAAe,MAAM,OAAO,QAAQ,OAAO,KAAK,GAAG,gBAAgB,MAAM;AAAA,IACrJ;AACA,cAAU,aAAa,UAAU,SAAS,IAAI;AAC9C,cAAU,QAAQ,IAAI,SAAO,IAAI,QAAQ;AACzC,QAAI,OAAO,OAAO;AAChB,gBAAU,CAAC;AAAA,IACb,WAAW,SAAS,WAAW;AAC7B,gBAAU;AAAA,IACZ,WAAW,SAAS,OAAO;AACzB,gBAAU,CAAC,GAAG,SAAS,GAAG,aAAa;AAAA,IACzC,WAAW,SAAS,UAAU;AAC5B,gBAAU,QAAQ,OAAO,aAAW,CAAC,cAAc,SAAS,OAAO,CAAC;AAAA,IACtE,WAAW,SAAS,UAAU;AAC5B,iBAAW,WAAW,eAAe;AACnC,kBAAU,QAAQ,SAAS,OAAO,IAAI,QAAQ,OAAO,QAAM,OAAO,OAAO,IAAI,CAAC,GAAG,SAAS,OAAO;AAAA,MACnG;AAAA,IACF;AACA,cAAU,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC9B,QAAI,CAAC,OAAO,SAAS,cAAc,WAAW,EAAG,OAAM,IAAI,aAAa,4CAA4C;AACpH,QAAI,QAAQ,SAAS,MAAO,OAAM,IAAI,aAAa,kBAAkB,KAAK,4BAA4B;AACtG,eAAW,WAAW,SAAS;AAC7B,YAAM,WAAW,QAAQ,KAAK,SAAO,IAAI,aAAa,OAAO;AAC7D,mBAAa,IAAI,SAAS,cAAc,SAAS,OAAO,IAAI,OAAO,SAAS,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC/G;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AAEA,QAAM,aAAa,QAAQ,IAAI,SAAO,IAAI,QAAQ,EAAE,OAAO,aAAW,CAAC,QAAQ,SAAS,OAAO,CAAC;AAChG,QAAM,mBAAmB,iBAAiB,SAAS,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,UAAQ,KAAK,cAAc,SAAS;AACvH,aAAW,WAAW,YAAY;AAChC,UAAM,OAAO,iBAAiB,KAAK,UAAQ,KAAK,oBAAoB,OAAO;AAC3E,QAAI,MAAM;AACR,wBAAkB,SAAS;AAAA,QACzB,OAAO;AAAA,QACP,cAAc;AAAA,QACd,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,WAAW,SAAS;AAC7B,sBAAkB,SAAS;AAAA,MACzB,WAAW;AAAA,MACX,cAAc,aAAa,IAAI,OAAO;AAAA,MACtC,aAAa;AAAA,MACb,eAAe;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,UAAG;AACzB,gBAAc,QAAQ,yEAAyE,EAAE,IAAI,SAAS,IAAI;AAClH,QAAM,YAAY,OAAO;AACzB,QAAM,SAAS,cAAc,QAAQ;AAAA;AAAA;AAAA,GAGpC;AACD,UAAQ,QAAQ,CAAC,SAAS,aAAa;AACrC,WAAO,IAAI,YAAY,SAAS,MAAM,OAAO,GAAG,SAAS,MAAM,SAAS,UAAU,aAAa,IAAI,OAAO,KAAK,MAAM,SAAS;AAAA,EAChI,CAAC;AACD,gBAAc,MAAM;AACpB,QAAM,UAAU,QAAQ,WAAW,IAAI,+BAA+B,IAAI,KAAK,YAAY,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,GAAG,QAAQ,IAAI;AAC7J,SAAO,EAAE,IAAI,MAAe,SAAS,eAAe,MAAM,UAAU,QAAQ,CAAC,KAAK,MAAM,WAAW,SAAS,KAAK;AACnH;AAEO,SAAS,kBAAkB,SAAiB,QAAsB;AACvE,QAAM,UAAU,oBAAI,IAAsB,CAAC,cAAc,YAAY,kBAAkB,YAAY,SAAS,CAAC;AAC7G,MAAI,CAAC,QAAQ,IAAI,OAAO,WAAW,EAAG,OAAM,IAAI,aAAa,6BAA6B,OAAO,WAAW,EAAE;AAC9G,QAAM,WAAW,UAAG;AACpB,EAAAA,cAAa,UAAU,SAAS,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO,cAAc;AACxB,aAAS,MAAM;AACf,WAAO,EAAE,IAAI,MAAe,QAAQ,MAAM,UAAU,OAAO,SAAS,cAAc,OAAO,aAAa,OAAO,OAAO,MAAM;AAAA,EAC5H;AACA,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMhB,EAAE,IAAI,OAAO,SAAS,OAAO,aAAa,WAAW,OAAO,gBAAgB,YAAY,YAAY,MAAM,OAAO,SAAS,MAAM,SAAS;AAC1I,WAAS,MAAM;AACf,SAAO,EAAE,IAAI,MAAe,SAAS,UAAU,OAAO,OAAO,IAAI,OAAO,WAAW,IAAI,UAAU,OAAO,SAAS,cAAc,OAAO,YAAY;AACpJ;;;AMt7BA,IAAM,uBAAuB;AAE7B,SAAS,WAAW,OAAuB;AACzC,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,eAAe,SAAiB,SAAiB,aAA6B;AACrF,SAAO,GAAG,oBAAoB,IAAI,OAAO,cAAc,WAAW,OAAO,CAAC,WAAW,WAAW,WAAW,CAAC,SAAS,WAAW,cAAc,CAAC,CAAC;AAClJ;AAEA,SAAS,iBAAiB,SAAiB,aAA6B;AACtE,SAAO,GAAG,oBAAoB,yBAAyB,WAAW,OAAO,CAAC,WAAW,WAAW,WAAW,CAAC,4CAA4C,WAAW,cAAc,CAAC,CAAC;AACrL;AAEA,SAAS,qBAAqB,aAAqB,eAA+B;AAChF,SAAO,kCAAkC,WAAW,aAAa,aAAa;AAChF;AAEO,SAAS,gBAAgB,SAAiB,aAA4C;AAC3F,QAAM,OAAO,oBAAoB,SAAS,WAAW;AACrD,QAAM,SAAS,KAAK;AACpB,QAAM,QAAQ,KAAK;AACnB,QAAM,oBAAoB,OAAO,IAAI,UAAQ,KAAK,QAAQ;AAC1D,QAAM,YAAY,KAAK,WAAW,IAAI,eAAa,UAAU,KAAK,EAAE,KAAK,OAAO,KAAK,OAAO,kBAAkB,KAAK,WAAW;AAC9H,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,UAAQ,KAAK,WAAW,SAAS,CAAC,CAAC;AAC3E,QAAM,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,UAAQ,KAAK,YAAY,SAAS,CAAC,CAAC;AAC7E,QAAM,SAAS,OAAO,SAAS,IAC3B;AAAA,IACA,OAAO,WAAW,IACd,oCAAoC,OAAO,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,OAC1E,qCAAqC,OAAO,MAAM,yBAAyB,kBAAkB,KAAK,IAAI,CAAC;AAAA,IAC3G,YAAY,sCAAsC,SAAS,KAAK;AAAA,IAChE,gBAAgB,OAAO,UAAU,KAAK,aAAa,cAAc,SAAS,KAAK,GAAG,CAAC,eAAe,UAAU,KAAK,GAAG,CAAC;AAAA,IACrH;AAAA,EACF,EAAE,KAAK,GAAG,IACR;AACJ,SAAO;AAAA,IACL;AAAA,IACA,eAAe,KAAK;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,gBAAgB,KAAK;AAAA,IACrB,oBAAoB,KAAK;AAAA,IACzB,QAAQ,KAAK;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,OAAO;AAAA,MACL,OAAO,QAAQ,UAAU,OAAO,SAAS,IAAI,GAAG,OAAO,MAAM,oBAAoB,MAAM,KAAK,KAAK;AAAA,MACjG,WAAW,QAAQ,2FAA2F;AAAA,MAC9G;AAAA,MACA,oBAAoB,OAAO;AAAA,MAC3B,qBAAqB;AAAA,MACrB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,cAAc,eAAe,QAAQ,SAAS,KAAK,aAAa;AAAA,MAChE,iBAAiB,QAAQ,GAAG,oBAAoB,sBAAsB,WAAW,OAAO,CAAC,eAAe,WAAW,MAAM,QAAQ,CAAC,SAAS,WAAW,cAAc,CAAC,CAAC,YAAY;AAAA,MAClL,oBAAoB,QAAQ,iBAAiB,SAAS,KAAK,aAAa,IAAI;AAAA,IAC9E;AAAA,IACA,WAAW,OAAO;AAAA,EACpB;AACF;AAEO,SAAS,yBAAyB,SAAiB,QAAoC;AAC5F,QAAM,OAAO,oBAAoB,SAAS,OAAO,WAAW;AAC5D,MAAI,CAAC,KAAK,WAAY,OAAM,IAAI,aAAa,gEAAgE;AAC7G,QAAM,iBAAiB,0BAA0B,SAAS,KAAK,aAAa,EAAE;AAC9E,QAAM,yBAAyB,eAAe,KAAK,aAAW,QAAQ,kBAAkB,KAAK,YAAY,QAAQ;AACjH,MAAI,0BAA0B,OAAO,cAAc;AACjD,UAAM,IAAI;AAAA,MACR,8BAA8B,uBAAuB,aAAa,mGAAmG,qBAAqB,KAAK,eAAe,uBAAuB,aAAa,CAAC;AAAA,MACnP;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,cAAc;AACvB,UAAM,eAAe,4BAA4B,SAAS,KAAK,WAAW,QAAQ;AAClF,UAAM,aAAa,2BAA2B;AAAA,MAC5C,SAAS,aAAa;AAAA,MACtB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB,aAAa;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX,UAAU,mBAAmB,SAAS,aAAa,WAAW;AAAA,MAC9D,WAAW;AAAA,IACb,CAAC;AACD,QAAI,CAAC,WAAW,GAAI,OAAM,IAAI,gBAAgB,WAAW,SAAS,WAAW,SAAS,mBAAmB,MAAM,KAAK,WAAW,MAAM,WAAW,SAAS;AAAA,EAC3J;AACA,QAAM,SAAS,kBAAkB,SAAS;AAAA,IACxC,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,IACnB,eAAe,KAAK,WAAW;AAAA,EACjC,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,KAAK;AAAA,IACpB,iBAAiB,KAAK,WAAW;AAAA,IACjC,gBAAgB,OAAO;AAAA,IACvB,qBAAqB,KAAK,YAAY,IAAI,WAAS,MAAM,QAAQ;AAAA,IACjE,SAAS;AAAA,MACP,yBACI,8BAA8B,uBAAuB,aAAa,iHAClE;AAAA,MACJ,eAAe,SAAS,KAAK,CAAC,yBAC1B,oBAAoB,eAAe,MAAM,2GACzC;AAAA,MACJ,KAAK,YAAY,SAAS,IACtB,mIACA;AAAA,IACN,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,EACjC;AACF;;;AClHA,SAASC,cAAa,UAAwB,SAAiB,SAAuB;AACpF,QAAM,MAAM,SAAS,QAAQ,uDAAuD,EAAE,IAAI,SAAS,OAAO;AAC1G,MAAI,CAAC,IAAK,OAAM,IAAI,aAAa,0BAA0B,OAAO,IAAI,GAAG;AAC3E;AAEA,SAASC,cAAa,UAAwB,SAAiB,SAAqC;AAClG,QAAM,MAAM,SAAS,QAAQ,4DAA4D,EAAE,IAAI,SAAS,OAAO;AAC/G,SAAO,KAAK;AACd;AAEA,SAASC,UAAS,UAAwB,SAAiB,SAAqC;AAC9F,QAAM,MAAM,SAAS,QAAQ,iHAAiH,EAAE,IAAI,SAAS,OAAO;AACpK,SAAO,KAAK;AACd;AAEA,SAASC,SAAQ,UAAwB,SAAiB,SAAyB;AACjF,MAAI,OAAO;AACX,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,CAAC,KAAK,IAAI,IAAI,GAAG;AACtB,SAAK,IAAI,IAAI;AACb,UAAM,SAASD,UAAS,UAAU,SAAS,IAAI;AAC/C,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASE,QAAO,SAAiB,QAAgB,OAAuB;AACtE,SAAO,GAAG,OAAO,IAAI,MAAM,iBAAiB,KAAK;AACnD;AAEA,SAAS,6BAA6B,UAAwB,SAAiB,MAAc,SAAiB,WAA4B;AACxI,QAAM,UAAU,aAAa,UAAU,SAAS,IAAI;AACpD,QAAM,OAAO,QAAQ,OAAO,SAAO,IAAI,aAAa,OAAO;AAC3D,MAAI,KAAK,WAAW,QAAQ,OAAQ,QAAO;AAC3C,WAAS,QAAQ,yEAAyE,EAAE,IAAI,SAAS,IAAI;AAC7G,QAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA,GAG/B;AACD,OAAK,QAAQ,CAAC,KAAK,aAAa;AAC9B,WAAO,IAAI,YAAY,SAAS,MAAM,IAAI,QAAQ,GAAG,SAAS,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM,SAAS;AAAA,EAC1H,CAAC;AACD,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAiB,QAA4D;AAC7G,QAAM,WAAW,UAAG;AACpB,EAAAJ,cAAa,UAAU,SAAS,OAAO,OAAO;AAC9C,QAAM,OAAO,OAAO,eAAeG,SAAQ,UAAU,SAAS,OAAO,OAAO;AAC5E,EAAAH,cAAa,UAAU,SAAS,IAAI;AACpC,MAAI,OAAO,YAAY,MAAM;AAC3B,aAAS,MAAM;AACf,UAAM,IAAI,aAAa,0FAA0F;AAAA,EACnH;AACA,QAAM,WAAW,mBAAmB,SAAS,IAAI;AACjD,MAAI,CAAC,SAAS,MAAM,KAAK,UAAQ,KAAK,aAAa,OAAO,OAAO,GAAG;AAClE,aAAS,MAAM;AACf,UAAM,IAAI,aAAa,SAAS,OAAO,OAAO,gCAAgC,IAAI,IAAI,GAAG;AAAA,EAC3F;AACA,MAAI;AACF,yCAAqC;AAAA,MACnC,SAASC,cAAa,UAAU,SAAS,IAAI;AAAA,MAC7C,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB;AAAA,MACA,aAAa;AAAA,MACb,WAAW;AAAA,IACb,CAAC;AAAA,EACH,SAAS,OAAO;AACd,aAAS,MAAM;AACf,UAAM;AAAA,EACR;AACA,QAAM,cAAc,SAAS,MAAM,OAAO,UAAQ,KAAK,mBAAmB,OAAO,OAAO;AACxF,QAAM,aAAa,SAAS,MAAM,OAAO,UAAQ,KAAK,oBAAoB,OAAO,OAAO;AACxF,QAAM,aAAa,CAAC,GAAG,aAAa,GAAG,UAAU,EAAE,IAAI,UAAQ,KAAK,EAAE;AACtE,QAAM,YAAY,OAAO;AACzB,QAAM,kBAAkB,YAAY,QAAQ,gBAAc,WACvD,OAAO,eAAa,WAAW,oBAAoB,UAAU,cAAc,EAC3E,IAAI,gBAAc;AAAA,IACjB,IAAIG,QAAO,SAAS,WAAW,iBAAiB,UAAU,cAAc;AAAA,IACxE,iBAAiB,WAAW;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,eAAe;AAAA,IACf,YAAY;AAAA,EACd,EAAE,CAAC;AACL,QAAM,mBAAmB,aAAa,UAAU,SAAS,IAAI,EAAE,KAAK,SAAO,IAAI,aAAa,OAAO,OAAO;AAC1G,MAAI,CAAC,OAAO,cAAc;AACxB,aAAS,MAAM;AACf,WAAO;AAAA,MACL,IAAI;AAAA,MAAM,QAAQ;AAAA,MAAM,UAAU,OAAO;AAAA,MAAS,eAAe;AAAA,MACjE,kBAAkB;AAAA,MAAY,kBAAkB;AAAA,MAAiB,mBAAmB;AAAA,MAAkB,iBAAiB;AAAA,IACzH;AAAA,EACF;AACA,MAAI,kBAAkB;AACpB,QAAI;AACF,yCAAmC,SAAS;AAAA,QAC1C,OAAO;AAAA,QACP,UAAU,CAAC,OAAO,OAAO;AAAA,QACzB,cAAc;AAAA,QACd,aAAa;AAAA,MACf,CAAC;AAAA,IACH,SAAS,OAAO;AACd,eAAS,MAAM;AACf,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI;AACF,aAAS,KAAK,6BAA6B;AAC3C,UAAM,aAAa,SAAS,QAAQ,yDAAyD;AAC7F,eAAW,kBAAkB,WAAY,YAAW,IAAI,gBAAgB,OAAO;AAC/E,UAAM,aAAa,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAInC;AACD,eAAW,QAAQ,gBAAiB,YAAW,IAAI,KAAK,IAAI,SAAS,KAAK,iBAAiB,KAAK,gBAAgB,KAAK,UAAU;AAC/H,aAAS,QAAQ,uFAAuF,EAAE,IAAI,SAAS,MAAM,OAAO,OAAO;AAC3I,iCAA6B,UAAU,SAAS,MAAM,OAAO,SAAS,SAAS;AAC/E,aAAS,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,aAAS,KAAK,UAAU;AACxB,aAAS,MAAM;AACf,UAAM;AAAA,EACR;AACA,WAAS,MAAM;AACf,SAAO;AAAA,IACL,IAAI;AAAA,IAAM,SAAS,WAAW,OAAO,OAAO,iBAAiB,IAAI;AAAA,IAAI,UAAU,OAAO;AAAA,IAAS,eAAe;AAAA,IAC9G,kBAAkB;AAAA,IAAY,kBAAkB;AAAA,IAAiB,mBAAmB;AAAA,IAAkB,iBAAiB;AAAA,EACzH;AACF;;;AChEA,SAAS,UAAU,SAAiB,QAAoD;AACtF,QAAM,QAAQ,WAAW,SAAS,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC;AACpE,QAAM,SAAS,CAAC,GAAG,MAAM,MAAM;AAC/B,WAAS,OAAO,GAAG,QAAQ,MAAM,WAAW,YAAY,QAAQ,GAAG;AACjE,WAAO,KAAK,GAAG,WAAW,SAAS,EAAE,MAAM,UAAU,KAAK,OAAO,CAAC,EAAE,MAAM;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAA8D;AAChF,MAAI,CAAC,QAAQ,UAAU,QAAQ,WAAW,MAAO,QAAO;AACxD,MAAI,QAAQ,WAAW,aAAa,QAAQ,WAAW,QAAS,QAAO,QAAQ;AAC/E,QAAM,IAAI,MAAM,+BAA+B,QAAQ,MAAM,EAAE;AACjE;AAEA,SAAS,eAAe,SAAiB,MAAiD;AACxF,MAAI,SAAS,UAAW,QAAO,UAAU,SAAS,SAAS;AAC3D,MAAI,SAAS,QAAS,QAAO,UAAU,SAAS,OAAO;AACvD,SAAO,CAAC,GAAG,UAAU,SAAS,SAAS,GAAG,GAAG,UAAU,SAAS,OAAO,CAAC;AAC1E;AAEA,SAAS,SAAS,SAAiB,OAA4B;AAC7D,QAAM,WAAW,MAAM,OAAO,mBAAmB,MAAM,IAAI;AAC3D,SAAO,WAAW,GAAG,OAAO,WAAW,QAAQ,KAAK,GAAG,OAAO,UAAU,MAAM,QAAQ;AACxF;AAEA,SAAS,SAAS,SAAiB,QAAgB,YAAmC,KAAqB;AACzG,SAAO,GAAG,OAAO,IAAI,MAAM,IAAI,UAAU,IAAI,GAAG;AAClD;AAEA,SAASC,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,GAAG,QAAQ,IAAI,OAAO,wBAAwB,WAAW,SAAS;AAC7F;AAEO,SAAS,uBAAuB,UAAwB,SAAiB,OAAoB,UAAwB,CAAC,GAAS;AACpI,QAAM,YAAY,QAAQ,UAAU,OAAO;AAC3C,QAAM,KAAK,SAAS,SAAS,KAAK;AAClC,QAAM,WAAW,MAAM,OAAO,mBAAmB,MAAM,IAAI,mBAAmB;AAC9E,4BAA0B,UAAU,SAAS,OAAO,SAAS;AAC7D,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkBhB,EAAE;AAAA,IACD;AAAA,IAAI;AAAA,IAAS,MAAM;AAAA,IAAU;AAAA,IAAU,MAAM;AAAA,IAAc,MAAM;AAAA,IAAO,MAAM;AAAA,IAC9E,MAAM,WAAW;AAAA,IAAM,MAAM,YAAY;AAAA,IAAM,MAAM,YAAY;AAAA,IACjE;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW,QAAQ,SAAS;AAAA,EAC/D;AACA,MAAI,MAAM,WAAW,QAAS,cAAa,UAAU,SAAS,IAAI,WAAW,OAAO,MAAM,UAAU,OAAO;AAC3G,MAAI,MAAM,MAAO,cAAa,UAAU,SAAS,IAAI,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO;AACvG,MAAI,MAAM,GAAI,cAAa,UAAU,SAAS,IAAI,MAAM,OAAO,MAAM,GAAG,KAAK,OAAO;AACpF,iCAA+B,UAAU,SAAS,KAAK;AACzD;AAEA,SAAS,aACP,UACA,SACA,QACA,YACA,OACA,KACA,UAAwB,CAAC,GACnB;AACN,QAAM,YAAY,QAAQ,UAAU,OAAO;AAC3C,QAAM,KAAK,SAAS,SAAS,QAAQ,YAAY,GAAG;AACpD,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmBhB,EAAE;AAAA,IACD;AAAA,IAAI;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAY,MAAM;AAAA,IACvC,eAAe,UAAU,MAAM,OAAO,iBAAiB,OAAO;AAAA,IAC9D,eAAe,OAAO,MAAM,IAAI,UAAU,OAAO;AAAA,IACjD,eAAe,OAAO,MAAM,IAAI,UAAU,OAAO;AAAA,IACjD,eAAe,OAAO,MAAM,IAAI,OAAO,OAAO;AAAA,IAC9C,eAAe,OAAO,MAAM,IAAI,cAAc,OAAO;AAAA,IACrD,eAAe,OAAO,MAAM,IAAI,QAAQ,OAAO;AAAA,IAC/C,MAAM,OAAO,cAAc,MAAM,IAAI,cAAc;AAAA,IACnD,MAAM,OAAO,gBAAgB,MAAM,IAAI,gBAAgB;AAAA,IACvD,MAAM,OAAO,cAAc,MAAM,IAAI,cAAc;AAAA,IACnD;AAAA,IAAW;AAAA,IAAW,QAAQ,SAAS;AAAA,EACzC;AACF;AAEO,SAAS,iBAAiB,UAAU,gBAAgB,UAAmC,CAAC,GAA4B;AACzH,QAAM,OAAO,WAAW,OAAO;AAC/B,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,EAAAA,eAAc,UAAU,OAAO;AAC/B,QAAM,QAAQ,eAAe,UAAU,SAAS,MAAM,SAAS;AAC/D,MAAI;AACF,UAAM,SAAS,eAAe,SAAS,IAAI;AAC3C,eAAW,SAAS,OAAQ,wBAAuB,UAAU,SAAS,OAAO,EAAE,OAAO,QAAQ,UAAU,CAAC;AACzG,UAAM,UAAU,cAAc,UAAU,SAAS,OAAO,QAAQ,IAAI;AACpE,qBAAiB,UAAU,OAAO,SAAS,IAAI;AAC/C,UAAMC,OAAM,eAAe,UAAU,OAAO;AAC5C,aAAS,MAAM;AACf,WAAO,EAAE,GAAG,SAAS,KAAAA,KAAI;AAAA,EAC3B,SAAS,OAAO;AACd,qBAAiB,UAAU,OAAO,cAAc,UAAU,SAAS,GAAG,IAAI,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnI,aAAS,MAAM;AACf,UAAM;AAAA,EACR;AACF;AAEA,SAAS,cAAc,UAAwB,SAAiB,eAAuB,MAAwE;AAC7J,QAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,QAAM,YAAY,SAAS,QAAQ,sEAAsE,EAAE,IAAI,OAAO;AACtH,SAAO;AAAA,IACL;AAAA,IACA,UAAU,cAAc;AAAA,IACxB,SAAS,OAAO,UAAU,KAAK;AAAA,IAC/B,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,eAAe,UAAwB,SAAiB,MAAkC,WAA2B;AAC5H,QAAM,KAAK,GAAG,OAAO,eAAe,SAAS;AAC7C,WAAS,QAAQ;AAAA;AAAA;AAAA,GAGhB,EAAE,IAAI,IAAI,SAAS,MAAM,SAAS;AACnC,SAAO;AACT;AAEA,SAAS,iBACP,UACA,OACA,SACA,OACM;AACN,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKhB,EAAE;AAAA,IACD,QAAQ,WAAW;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAwB,SAAwD;AACpG,QAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAK7B,EAAE,IAAI,OAAO;AACd,SAAO;AAAA,IACL,SAAS,OAAO,KAAK,KAAK,SAAO,IAAI,gBAAgB,SAAS,GAAG,SAAS,CAAC;AAAA,IAC3E,OAAO,OAAO,KAAK,KAAK,SAAO,IAAI,gBAAgB,OAAO,GAAG,SAAS,CAAC;AAAA,IACvE,IAAI,OAAO,KAAK,KAAK,SAAO,IAAI,gBAAgB,IAAI,GAAG,SAAS,CAAC;AAAA,EACnE;AACF;AAEO,SAAS,uBAAuB,UAAU,gBAAqC;AACpF,QAAM,WAAW,UAAU;AAC3B,QAAM,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMhC,EAAE,IAAI,OAAO;AACd,QAAM,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMhC,EAAE,IAAI,OAAO;AACd,QAAM,SAAS,aAAa,UAAU,OAAO;AAC7C,QAAM,eAAe,eAAe,UAAU,OAAO;AACrD,QAAM,gBAAgB,QAAQ,IAAI,QAAQ;AAC1C,QAAM,cAAc,QAAQ,IAAI,YAAU,SAAS,QAAQ,cAAc,OAAO,YAAU,OAAO,cAAc,OAAO,EAAE,CAAC,CAAC;AAC1H,QAAM,YAAY,qBAAqB,UAAU,SAAS,aAAa,aAAa;AACpF,WAAS,MAAM;AACf,SAAO;AAAA,IACL;AAAA,IACA,UAAU,cAAc;AAAA,IACxB,SAAS,YAAY,IAAI,aAAW,EAAE,GAAG,QAAQ,UAAU,UAAU,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE;AAAA,IACxG,gBAAgB;AAAA,IAChB,QAAQ;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,IAAI,OAAO;AAAA,IACb;AAAA,IACA,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,eAAe,UAAwB,SAAkD;AAChG,QAAM,MAAM,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAO5B,EAAE,IAAI,OAAO;AACd,SAAO,MAAM,WAAW,GAAG,IAAI;AACjC;AAEA,SAAS,WAAW,KAAwC;AAC1D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,SAAS,IAAI;AAAA,IACb,aAAa,IAAI;AAAA,IACjB,iBAAiB,QAAQ,IAAI,eAAe;AAAA,IAC5C,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,cAAc,IAAI,gBAAgB;AAAA,IAClC,gBAAgB,OAAO,IAAI,cAAc;AAAA,IACzC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,eAAe;AAAA,MACb,SAAS,OAAO,IAAI,qBAAqB;AAAA,MACzC,OAAO,OAAO,IAAI,mBAAmB;AAAA,MACrC,IAAI,OAAO,IAAI,gBAAgB;AAAA,IACjC;AAAA,IACA,OAAO,IAAI,SAAS;AAAA,EACtB;AACF;AAEA,SAAS,SAAS,QAAyB,SAAiD;AAC1F,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,SAAS,OAAO;AAAA,IAChB,oBAAoB,OAAO;AAAA,IAC3B,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO,WAAW;AAAA,IAC3B,UAAU,OAAO,YAAY;AAAA,IAC7B,UAAU,OAAO,YAAY;AAAA,IAC7B,YAAY,OAAO;AAAA,IACnB,eAAe,OAAO,iBAAiB;AAAA,IACvC,cAAc,OAAO;AAAA,IACrB,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C;AAAA,IACA,UAAU,EAAE,YAAY,CAAC,EAAE;AAAA,EAC7B;AACF;AAEA,SAAS,SAAS,QAA4C;AAC5D,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,UAAU,OAAO,YAAY;AAAA,IAC7B,YAAY,OAAO,cAAc;AAAA,IACjC,WAAW,OAAO,aAAa;AAAA,IAC/B,WAAW,OAAO,aAAa;AAAA,IAC/B,QAAQ,OAAO,UAAU;AAAA,IACzB,eAAe,OAAO,iBAAiB;AAAA,IACvC,MAAM,OAAO,QAAQ;AAAA,IACrB,YAAY,OAAO,cAAc;AAAA,IACjC,cAAc,OAAO,gBAAgB;AAAA,IACrC,YAAY,OAAO,cAAc;AAAA,IACjC,eAAe,OAAO,iBAAiB;AAAA,IACvC,cAAc,OAAO;AAAA,IACrB,mBAAmB,OAAO,qBAAqB;AAAA,EACjD;AACF;;;AC3WA,IAAM,iBAAiB,oBAAI,IAAyB,CAAC,OAAO,cAAc,aAAa,gBAAgB,cAAc,CAAC;AACtH,IAAM,gBAAgB,oBAAI,IAAwB,CAAC,OAAO,cAAc,YAAY,kBAAkB,YAAY,SAAS,CAAC;AAC5H,IAAM,mBAAmB,oBAAI,IAA2B,CAAC,OAAO,WAAW,aAAa,UAAU,WAAW,cAAc,eAAe,CAAC;AAC3I,IAAM,mBAAmB,oBAAI,IAA2B,CAAC,OAAO,YAAY,cAAc,CAAC;AAE3F,SAAS,gBAAkC,OAAgB,SAAiB,UAAgB;AAC1F,SAAO,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAU,IAAI,QAAa;AAC7E;AAEA,SAAS,YAAY,QAA2B;AAC9C,SAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,YAAU,OAAO,WAAW,CAAC;AACjE;AAEA,SAAS,eAAe,QAA2B,SAAuC;AACxF,QAAM,QAAQ,YAAY,MAAM;AAChC,MAAI,YAAY,aAAc,QAAO,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,IAAI,IAAI;AAC1E,MAAI,YAAY,YAAa,QAAO,MAAM,IAAI,IAAI;AAClD,MAAI,YAAY,eAAgB,QAAO,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAI;AAC3E,MAAI,YAAY,eAAgB,QAAO,MAAM,IAAI,SAAS,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,IAAI,IAAI;AACrG,SAAO;AACT;AAEA,SAAS,iBAAiB,QAA2B,WAA2C;AAC9F,MAAI,cAAc,gBAAiB,QAAO,OAAO,SAAS,WAAW,WAAW;AAChF,MAAI,cAAc,aAAc,QAAO,CAAC,OAAO,SAAS,WAAW,KAAK,UAAQ,KAAK,WAAW,QAAQ;AACxG,MAAI,cAAc,MAAO,QAAO;AAChC,SAAO,OAAO,SAAS,WAAW,KAAK,UAAQ,KAAK,WAAW,SAAS;AAC1E;AAEA,SAAS,iBAAiB,QAA2B,WAA2C;AAC9F,MAAI,cAAc,WAAY,QAAO,QAAQ,OAAO,SAAS,SAAS;AACtE,MAAI,cAAc,eAAgB,QAAO,CAAC,OAAO,SAAS;AAC1D,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA8B,UAA6B,CAAC,GAAG;AAC1F,QAAM,YAAY,gBAAgB,QAAQ,WAAW,kBAAkB,KAAK;AAC5E,QAAM,SAAS,gBAAgB,QAAQ,QAAQ,eAAe,KAAK;AACnE,QAAM,YAAY,gBAAgB,QAAQ,WAAW,kBAAkB,KAAK;AAC5E,QAAM,UAAU,gBAAgB,QAAQ,SAAS,gBAAgB,KAAK;AACtE,QAAM,QAAQ,QAAQ,OAAO,KAAK,EAAE,YAAY,KAAK;AACrD,SAAO,QAAQ,OAAO,YAAU;AAC9B,QAAI,CAAC,eAAe,QAAQ,OAAO,EAAG,QAAO;AAC7C,QAAI,WAAW,UAAU,OAAO,SAAS,QAAQ,gBAAgB,kBAAkB,OAAQ,QAAO;AAClG,QAAI,CAAC,iBAAiB,QAAQ,SAAS,EAAG,QAAO;AACjD,QAAI,CAAC,iBAAiB,QAAQ,SAAS,EAAG,QAAO;AACjD,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,SAAS,QAAQ;AAAA,MACxB,GAAG,OAAO,SAAS,WAAW,IAAI,UAAQ,GAAG,KAAK,OAAO,IAAI,KAAK,MAAM,EAAE;AAAA,IAC5E,EAAE,KAAK,GAAG,EAAE,YAAY,EAAE,SAAS,KAAK;AAAA,EAC1C,CAAC;AACH;AAEO,SAAS,cAAc,SAAiB,UAA6B,CAAC,GAAG;AAC9E,QAAM,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,QAAQ,YAAY,EAAE,GAAG,CAAC,GAAG,GAAG;AAC1E,QAAM,OAAO,KAAK,IAAI,OAAO,QAAQ,QAAQ,CAAC,GAAG,CAAC;AAClD,QAAM,eAAe,QAAQ,UAAU,iBAAiB,SAAS,EAAE,QAAQ,QAAQ,UAAU,MAAM,CAAC,IAAI;AACxG,QAAM,WAAW,uBAAuB,OAAO;AAC/C,QAAM,UAAU,oBAAoB,SAAS,SAAS,OAAO;AAC7D,QAAM,aAAa,KAAK,IAAI,KAAK,KAAK,QAAQ,SAAS,QAAQ,GAAG,CAAC;AACnE,QAAM,WAAW,KAAK,IAAI,MAAM,UAAU;AAC1C,QAAM,SAAS,WAAW,KAAK;AAC/B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,QAAQ,MAAM,OAAO,QAAQ,QAAQ;AAAA,IAC9C,eAAe;AAAA,IACf,YAAY,EAAE,MAAM,UAAU,UAAU,OAAO,QAAQ,QAAQ,WAAW;AAAA,EAC5E;AACF;AAEO,SAAS,uBAAuB,SAAiB,OAAgC;AACtF,SAAO,cAAc,SAAS;AAAA,IAC5B,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,IAC5B,UAAU,OAAO,MAAM,YAAY,EAAE;AAAA,IACrC,WAAW,gBAAgB,MAAM,WAAW,kBAAkB,KAAK;AAAA,IACnE,OAAO,OAAO,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA,IAC/C,SAAS,MAAM,YAAY;AAAA,IAC3B,QAAQ,gBAAgB,MAAM,QAAQ,eAAe,KAAK;AAAA,IAC1D,WAAW,gBAAgB,MAAM,WAAW,kBAAkB,KAAK;AAAA,IACnE,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAuC;AAAA,IACxF,SAAS,gBAAgB,MAAM,SAAS,gBAAgB,KAAK;AAAA,EAC/D,CAAC;AACH;;;ACrFA,IAAM,eAAe,oBAAI,IAAsB,CAAC,cAAc,YAAY,kBAAkB,YAAY,SAAS,CAAC;AAElH,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACnC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,iBAAiB;AAC1B;AAEA,SAAS,aAAa,KAAqC,QAAwC;AACjG,QAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,OAAO,UAAU,SAAU,OAAM,IAAI,UAAU,oCAAoC,MAAM,EAAE;AAC/F,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAqC,QAA+C;AAChH,QAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,IAAI,UAAU,oCAAoC,MAAM,EAAE;AAClE;AAEA,SAAS,mBAAmB,KAAuD;AACjF,QAAMC,eAAc,aAAa,KAAK,cAAc;AACpD,MAAI,CAAC,aAAa,IAAIA,YAA+B,EAAG,OAAM,IAAI,UAAU,+BAA+BA,YAAW,EAAE;AACxH,SAAO;AAAA,IACL,UAAU,aAAa,KAAK,UAAU;AAAA,IACtC,cAAcA;AAAA,IACd,aAAa,qBAAqB,KAAK,aAAa;AAAA,IACpD,YAAY,qBAAqB,KAAK,YAAY;AAAA,IAClD,OAAO,qBAAqB,KAAK,OAAO;AAAA,IACxC,YAAY,aAAa,KAAK,YAAY;AAAA,EAC5C;AACF;AAEA,SAAS,qBAAqB,KAA2C;AACvE,SAAO;AAAA,IACL,UAAU,IAAI;AAAA,IACd,cAAc,IAAI;AAAA,IAClB,aAAa,IAAI,eAAe;AAAA,IAChC,YAAY,IAAI,cAAc;AAAA,IAC9B,OAAO,IAAI,SAAS;AAAA,IACpB,YAAY,IAAI;AAAA,EAClB;AACF;AAEO,SAAS,kBAAkB,SAAiB,UAAwD;AACzG,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AACnC,qBAAmB,OAAO;AAC1B,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAMC,gBAAe,SAAS,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AACrD,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA,2BAGPA,aAAY;AAAA,KAClC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,kBAAkB;AAC1C,WAAO,OAAO,YAAY,KAAK,IAAI,SAAO,CAAC,IAAI,UAAU,qBAAqB,GAAG,CAAC,CAAC,CAAC;AAAA,EACtF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,SAAiB,QAAsB;AACrE,qBAAmB,OAAO;AAC1B,SAAO,kBAAkB,SAAS,MAAM;AAC1C;AAEA,SAAS,cAAc,SAA8B;AACnD,SAAO,IAAI,IAAI,YAAY,OAAO,EAAE,IAAI,WAAS,MAAM,QAAQ,CAAC;AAClE;AAEA,SAAS,YAAY,SAAgC;AACnD,QAAM,QAAQ,WAAW,SAAS,EAAE,MAAM,GAAG,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAC7E,QAAM,SAAS,CAAC,GAAG,MAAM,MAAM;AAC/B,WAAS,OAAO,GAAG,QAAQ,MAAM,WAAW,YAAY,QAAQ,GAAG;AACjE,WAAO,KAAK,GAAG,WAAW,SAAS,EAAE,MAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC,EAAE,MAAM;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAA8B;AACpD,QAAM,MAAM,SAAS,IAAI,aAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO;AAClE,SAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;AACzB;AAEO,SAAS,iBAAiB,SAAiB,QAAgD;AAChG,MAAI,CAAC,aAAa,IAAI,OAAO,WAAW,EAAG,OAAM,IAAI,iBAAiB,mCAAmC,OAAO,WAAW,EAAE;AAC7H,QAAM,WAAW,eAAe,OAAO,QAAQ;AAC/C,MAAI,SAAS,SAAS,EAAG,OAAM,IAAI,iBAAiB,mDAAmD;AACvG,QAAM,gBAAgB,cAAc,OAAO;AAC3C,QAAM,aAAa,SAAS,OAAO,aAAW,CAAC,cAAc,IAAI,OAAO,CAAC;AACzE,MAAI,WAAW,SAAS,EAAG,OAAM,IAAI,iBAAiB,sBAAsB,WAAW,WAAW,IAAI,KAAK,GAAG,KAAK,WAAW,KAAK,IAAI,CAAC,IAAI,GAAG;AAE/I,MAAI,CAAC,OAAO,cAAc;AACxB,UAAMC,WAAU,SAAS,IAAI,cAAY;AAAA,MACvC,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,IACvB,EAAE;AACF,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,cAAc,SAAS,MAAM,eAAe,SAAS,WAAW,IAAI,KAAK,GAAG,IAAI,OAAO,WAAW;AAAA,MAC3G,cAAc,OAAO;AAAA,MACrB,OAAO,OAAO;AAAA,MACd,OAAOA,SAAQ;AAAA,MACf,SAAAA;AAAA,IACF;AAAA,EACF;AAEA,qBAAmB,OAAO;AAC1B,QAAM,UAAU,SAAS,IAAI,aAAW;AACtC,UAAM,SAAS,kBAAkB,SAAS;AAAA,MACxC;AAAA,MACA,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,IACvB;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,UAAU,QAAQ,MAAM,eAAe,QAAQ,WAAW,IAAI,KAAK,GAAG,IAAI,OAAO,WAAW;AAAA,IACrG,cAAc,OAAO;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,OAAO,QAAQ;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAkC;AAC9D,QAAM,WAAW,OAAO,UAAU,WAAW,QAAQ;AACrD,SAAO,SAAS,QAAQ,MAAM,GAAG;AACnC;AAEA,SAAS,iCAAiC,MAAkD;AAC1F,MAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAG,OAAM,IAAI,iBAAiB,4CAA4C;AAC1G,QAAM,aAAa,KAAK,SAAS,KAAK,aAAW,OAAO,YAAY,QAAQ;AAC5E,MAAI,eAAe,OAAW,OAAM,IAAI,iBAAiB,6CAA6C;AACtG,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,aAAa,qBAAqB,KAAK,eAAe,KAAK,KAAK;AAAA,IAChE,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,cAAc,KAAK,iBAAiB,QAAQ,KAAK,WAAW;AAAA,EAC9D;AACF;AAEO,SAAS,gCAAgC,SAAiB,MAAoD;AACnH,SAAO,iBAAiB,SAAS,iCAAiC,IAAI,CAAC;AACzE;AAEO,SAAS,2BAA2B,SAAiB,OAAwC;AAClG,MAAI,CAAC,MAAM,OAAO,cAAe,OAAM,IAAI,iBAAiB,4BAA4B,MAAM,QAAQ,EAAE;AACxG,QAAM,SAAS,kBAAkB,SAAS,CAAC,MAAM,QAAQ,CAAC,EAAE,MAAM,QAAQ;AAC1E,MAAI,QAAQ,iBAAiB,WAAY,OAAM,IAAI,iBAAiB,mDAAmD,MAAM,QAAQ,IAAI,GAAG;AAC5I,SAAO;AACT;AAEO,SAAS,+BAA+B,SAAiB,cAAmC;AACjG,QAAM,QAAQ,YAAY,OAAO,EAAE,KAAK,UAAQ,KAAK,OAAO,kBAAkB,YAAY;AAC1F,MAAI,CAAC,MAAO,OAAM,IAAI,iBAAiB,6BAA6B,YAAY,IAAI,GAAG;AACvF,6BAA2B,SAAS,KAAK;AACzC,SAAO;AACT;AAEO,SAAS,wBAAwB,SAAiB,UAAsD;AAC7G,QAAMC,iBAAgB,SAAS,OAAO,OAAO,WAAS,MAAM,OAAO,aAAa,EAAE,IAAI,WAAS,MAAM,QAAQ;AAC7G,QAAM,YAAY,kBAAkB,SAASA,cAAa;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,SAAS,OAAO,IAAI,WAAS;AACnC,YAAM,SAAS,UAAU,MAAM,QAAQ;AACvC,UAAI,CAAC,MAAM,OAAO,iBAAiB,CAAC,OAAQ,QAAO;AACnD,aAAO,EAAE,GAAG,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,cAAc,OAAO,cAAc,YAAY,OAAO,WAAW,EAAE;AAAA,IACvH,CAAC;AAAA,EACH;AACF;;;ACxMA,SAASC,WAAU,SAAiB,QAAoD;AACtF,QAAM,QAAQ,WAAW,SAAS,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC;AACpE,QAAM,SAAS,CAAC,GAAG,MAAM,MAAM;AAC/B,WAAS,OAAO,GAAG,QAAQ,MAAM,WAAW,YAAY,QAAQ,GAAG;AACjE,WAAO,KAAK,GAAG,WAAW,SAAS,EAAE,MAAM,UAAU,KAAK,OAAO,CAAC,EAAE,MAAM;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAA6B;AAC7C,SAAO,QAAQ,MAAM,YAAY,KAAK,eAAa,UAAU,WAAW,QAAQ,CAAC;AACnF;AAEA,SAAS,YAAY,OAA6B;AAChD,SAAO,QAAQ,MAAM,YAAY,KAAK,eAAa,UAAU,WAAW,WAAW,CAAC;AACtF;AAEA,SAAS,cAAc,OAA6B;AAClD,SAAO,MAAM,WAAW,cAAc,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,KAAK;AACxG;AAEA,SAAS,YAAY,SAAiB,QAA0C;AAC9E,QAAM,YAAY,kBAAkB,SAAS,OAAO,IAAI,WAAS,MAAM,QAAQ,CAAC;AAChF,SAAO,OAAO,IAAI,YAAU;AAAA,IAC1B,GAAG;AAAA,IACH,QAAQ,UAAU,MAAM,QAAQ,IAC5B;AAAA,MACE,OAAO,UAAU,MAAM,QAAQ,EAAE;AAAA,MACjC,cAAc,UAAU,MAAM,QAAQ,EAAE;AAAA,MACxC,YAAY,UAAU,MAAM,QAAQ,EAAE;AAAA,IACxC,IACA,EAAE,cAAc,aAAa;AAAA,EACnC,EAAE;AACJ;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,MAAM,QAAQ,gBAAgB;AACvC;AAEA,SAAS,QAAQ,SAAiBC,cAAgC,eAA8B,OAAgC;AAC9H,QAAM,gBAAgBA,aAAY,OAAO,WAAS,MAAM,YAAY,OAAO;AAC3E,QAAM,UAAU,cAAc,OAAO,WAAS,YAAY,KAAK,MAAM,YAAY;AACjF,QAAM,gBAAgB,cAAc,OAAO,WAAS,YAAY,KAAK,MAAM,UAAU;AACrF,QAAM,gBAAgB,cAAc,OAAO,WAAS,YAAY,KAAK,MAAM,gBAAgB;AAC3F,QAAM,gBAAgB,cAAc,OAAO,WAAS,YAAY,KAAK,MAAM,cAAc,YAAY,KAAK,MAAM,SAAS;AACzH,QAAM,cAAc,cAAc,OAAO,WAAS,MAAM,YAAY,WAAW,cAAc,KAAK,CAAC;AACnG,QAAM,YAAY,cAAc,OAAO,WAAS,MAAM,YAAY,WAAW,YAAY,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC;AACnH,QAAM,SAAS,cAAc,OAAO,WAAS,MAAM,YAAY,WAAW,SAAS,KAAK,CAAC;AACzF,SAAO;AAAA,IACL,eAAe,cAAc,MAAM,GAAG,KAAK;AAAA,IAC3C;AAAA,IACA,SAAS,QAAQ,MAAM,GAAG,KAAK;AAAA,IAC/B,eAAe,cAAc,MAAM,GAAG,KAAK;AAAA,IAC3C,QAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,IAC7B,aAAa,YAAY,MAAM,GAAG,KAAK;AAAA,IACvC,eAAe,cAAc,MAAM,GAAG,KAAK;AAAA,IAC3C,WAAW,UAAU,MAAM,GAAG,KAAK;AAAA,IACnC,QAAQ;AAAA,MACN,eAAe,cAAc;AAAA,MAC7B,SAAS,QAAQ;AAAA,MACjB,eAAe,cAAc;AAAA,MAC7B,QAAQ,OAAO;AAAA,MACf,aAAa,YAAY;AAAA,MACzB,eAAe,cAAc;AAAA,MAC7B,WAAW,UAAU;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,SAAiB;AAChC,QAAM,SAAS;AACf,SAAO;AAAA,IACL,gBAAgB,GAAG,MAAM,2BAA2B,OAAO;AAAA,IAC3D,qBAAqB,GAAG,MAAM,2BAA2B,OAAO;AAAA,IAChE,kBAAkB,GAAG,MAAM,yBAAyB,OAAO;AAAA,IAC3D,cAAc,GAAG,MAAM,2BAA2B,OAAO;AAAA,IACzD,kBAAkB,GAAG,MAAM,uCAAuC,OAAO;AAAA,EAC3E;AACF;AAEO,SAAS,eAAe,UAAU,gBAAgB,UAAwB,CAAC,GAAwB;AACxG,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;AAClE,QAAMA,eAAcD,WAAU,SAAS,OAAO;AAC9C,QAAM,gBAAgBA,WAAU,SAAS,SAAS;AAClD,QAAM,WAAW,MAAM,KAAK,IAAI,IAAI,CAAC,GAAGC,cAAa,GAAG,aAAa,EAAE,IAAI,WAAS,MAAM,OAAO,CAAC,CAAC,EAChG,OAAO,aAAW,CAAC,QAAQ,WAAW,QAAQ,YAAY,SAAS,YAAY,QAAQ,OAAO,EAC9F,KAAK;AACR,QAAM,aAAa,IAAI,IAAI,QAAQ;AACnC,QAAM,sBAAsB,YAAY,SAASA,aAAY,OAAO,WAAS,WAAW,IAAI,MAAM,OAAO,CAAC,CAAC;AAC3G,QAAMC,SAAQ,SAAS,IAAI,aAAW,QAAQ,SAAS,qBAAqB,eAAe,KAAK,CAAC;AACjG,SAAO;AAAA,IACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAAS,QAAQ,OAAO;AAAA,IACxB,OAAAA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,eAAeA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,eAAe,CAAC;AAAA,MAC7E,UAAUA,OAAM;AAAA,MAChB,SAASA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,MACjE,eAAeA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,eAAe,CAAC;AAAA,MAC7E,QAAQA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC;AAAA,MAC/D,aAAaA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,aAAa,CAAC;AAAA,MACzE,eAAeA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,eAAe,CAAC;AAAA,MAC7E,WAAWA,OAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,IACvE;AAAA,EACF;AACF;;;AC9GO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,iBAAiB;AAC1B;AAEA,SAAS,UAAU,KAA8B;AAC/C,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,iBAAiB,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AAAA,IACjF,UAAU,OAAO,IAAI,YAAY,CAAC;AAAA,IAClC,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAqC;AAAA,IAC5F,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,eAAe,OAAO,IAAI,kBAAkB,WAAW,IAAI,gBAAgB;AAAA,IAC3E,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,YAAY,UAAwB,IAAkC;AAC7E,SAAQ,SAAS,QAAQ;AAAA;AAAA;AAAA,GAGxB,EAAE,IAAI,EAAE,EAAY,IAAI,SAAS;AACpC;AAEA,SAAS,SAAS,UAAwB,KAA6B;AACrE,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,MAAM;AAAA,IACN,KAAK,OAAO,IAAI,GAAG;AAAA,IACnB,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,QAAQ,IAAI,WAAW,aAAa,aAAa;AAAA,IACjD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,OAAO,YAAY,UAAU,EAAE;AAAA,EACjC;AACF;AAEA,SAAS,UAAU,UAAwB,SAAiBC,QAAkC;AAC5F,QAAM,MAAM,SAAS,QAAQ;AAAA;AAAA,GAE5B,EAAE,IAAIA,QAAO,OAAO;AACrB,MAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,uBAAuBA,MAAK,IAAI,GAAG;AAC3E,SAAO,SAAS,UAAU,GAAG;AAC/B;AAEO,SAAS,iBAAiB,SAAiBA,QAAkC;AAClF,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,WAAO,UAAU,UAAU,SAASA,MAAK;AAAA,EAC3C,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAcO,SAAS,iBAAiB,SAAiBC,QAAe,cAAuB;AACtF,QAAM,UAAU,EAAE,SAAS,YAAYA,QAAO,QAAQ,WAAW;AACjE,MAAI,CAAC,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,SAAS,4BAA4BA,MAAK,IAAI,QAAQ;AAC5H,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,cAAU,UAAU,SAASA,MAAK;AAClC,aAAS,QAAQ,mEAAmE,EAAE,IAAI,YAAY,OAAO,GAAGA,MAAK;AACrH,WAAO,EAAE,IAAI,MAAe,SAAS,uBAAuBA,MAAK,IAAI,YAAY,UAAU,UAAU,SAASA,MAAK,EAAE;AAAA,EACvH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiBA,QAAe,cAAuB;AACvF,QAAM,UAAU,EAAE,SAAS,YAAYA,QAAO,QAAQ,SAAS;AAC/D,MAAI,CAAC,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,SAAS,6BAA6BA,MAAK,IAAI,QAAQ;AAC7H,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,cAAU,UAAU,SAASA,MAAK;AAClC,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ;AAAA;AAAA;AAAA,KAGhB,EAAE,IAAI,WAAW,SAASA,MAAK;AAChC,aAAS,QAAQ,mEAAmE,EAAE,IAAI,UAAU,WAAWA,MAAK;AACpH,WAAO,EAAE,IAAI,MAAe,SAAS,wBAAwBA,MAAK,IAAI,YAAY,UAAU,UAAU,SAASA,MAAK,EAAE;AAAA,EACxH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;ACjHA,OAAO,aAAa;AAcpB,IAAMC,UAAS,oBAAI,IAAyB,CAAC,SAAS,SAAS,QAAQ,CAAC;AAEjE,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,iBAAiB;AAC1B;AAEA,SAASC,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAAS,YAAY,OAA2B,OAAuB;AACrE,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,CAAC,KAAM,OAAM,IAAI,oBAAoB,aAAa,KAAK,cAAc;AACzE,SAAO;AACT;AAEA,SAASC,gBAAe,OAA2B,UAAoD;AACrG,QAAM,QAAS,SAAS;AACxB,MAAI,CAACF,QAAO,IAAI,KAAK,EAAG,OAAM,IAAI,oBAAoB,gCAAgC,KAAK,EAAE;AAC7F,SAAO;AACT;AAEA,SAAS,KAAK,OAAuB;AACnC,SAAO,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK;AAC/F;AAEA,SAAS,MAAM,SAAiB,MAA6B,KAAqB;AAChF,SAAO,GAAG,OAAO,IAAI,IAAI,IAAI,GAAG;AAClC;AAEA,SAAS,OAAO,gBAAwB,SAAyB;AAC/D,SAAO,GAAG,cAAc,UAAU,OAAO;AAC3C;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,WAAW;AACjB,MAAI,QAAQ,SAAS,OAAQ,QAAO,SAAS,KAAK;AAClD,SAAO,IAAI,QAAQ,SAAS,SAAS,CAAC;AACxC;AAEA,SAASG,WAAU,KAA8B;AAC/C,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,iBAAiB,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AAAA,IACjF,UAAU,OAAO,IAAI,YAAY,CAAC;AAAA,IAClC,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAqC;AAAA,IAC5F,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,eAAe,OAAO,IAAI,kBAAkB,WAAW,IAAI,gBAAgB;AAAA,IAC3E,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAASC,aAAY,UAAwB,IAAkC;AAC7E,SAAQ,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIxB,EAAE,IAAI,EAAE,EAAY,IAAID,UAAS;AACpC;AAEA,SAASE,UAAS,UAAwB,KAA6B;AACrE,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,KAAK,OAAO,IAAI,GAAG;AAAA,IACnB,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,QAAQ,IAAI,WAAW,aAAa,aAAa;AAAA,IACjD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,OAAOD,aAAY,UAAU,EAAE;AAAA,EACjC;AACF;AAEA,SAAS,WAAW,UAAwB,IAAsC;AAChF,QAAM,MAAM,SAAS,QAAQ,2CAA2C,EAAE,IAAI,EAAE;AAChF,SAAO,MAAMC,UAAS,UAAU,GAAG,IAAI;AACzC;AAEA,SAAS,cAAc,UAAwB,SAAoC;AACjF,qBAAmB,UAAU,SAAS;AAAA,IACpC,WAAW;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AACD,QAAM,QAAQ,WAAW,UAAU,MAAM,SAAS,WAAW,SAAS,CAAC;AACvE,MAAI,CAAC,MAAO,OAAM,IAAI,oBAAoB,8CAA8C,OAAO,IAAI,GAAG;AACtG,SAAO;AACT;AAEA,SAAS,mBAAmB,UAAwB,SAAiB,QAK1D;AACT,EAAAJ,eAAc,UAAU,OAAO;AAC/B,QAAM,YAAY,OAAO;AACzB,QAAM,KAAK,MAAM,SAAS,OAAO,MAAM,OAAO,GAAG;AACjD,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKhB,EAAE,IAAI,IAAI,SAAS,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,OAAO,WAAW,WAAW,SAAS;AACjG,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAwB,IAAY,OAQnD;AACR,WAAS,QAAQ,8CAA8C,EAAE,IAAI,EAAE;AACvE,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKlC;AACD,aAAW,QAAQ,OAAO;AACxB,cAAU;AAAA,MACR,OAAO,IAAI,KAAK,OAAO;AAAA,MACvB;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,kBAAkB;AAAA,MACvB,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,SAAyC;AACjF,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,UAAU,cAAc,UAAU,OAAO;AAC/C,UAAM,aAAa,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAInC,EAAE,IAAI,OAAO;AACd,UAAM,aAAa,WAAW,IAAI,SAAOI,UAAS,UAAU,GAAG,CAAC;AAChE,WAAO;AAAA,MACL;AAAA,MACA,WAAW,OAAO;AAAA,MAClB;AAAA,MACA,mBAAmB,WAAW,KAAK,SAAO,IAAI,WAAW,QAAQ,KAAK;AAAA,MACtE,aAAa;AAAA,IACf;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,oBAAoB,SAAiB,QAKlD;AACD,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,OAAO,SAAS,IAAI,aAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC5F,QAAM,QAAQH,gBAAe,OAAO,YAAY,OAAO;AACvD,QAAM,UAAU,EAAE,UAAU,OAAO,OAAO,OAAO,SAAS,YAAY,MAAM;AAC5E,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,SAAS,gBAAgB,SAAS,MAAM,WAAW,QAAQ;AACxI,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,UAAU,cAAc,UAAU,OAAO;AAC/C,UAAM,aAAa,OAAO;AAC1B,oBAAgB,UAAU,QAAQ,IAAI,SAAS,IAAI,CAAC,SAAS,WAAW;AAAA,MACtE;AAAA,MACA,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,IACd,EAAE,CAAC;AACH,aAAS,QAAQ,uDAAuD,EAAE,IAAI,YAAY,QAAQ,EAAE;AACpG,WAAO,EAAE,IAAI,MAAe,SAAS,YAAY,SAAS,MAAM,WAAW,WAAW,WAAW,UAAU,QAAQ,EAAE,EAAE;AAAA,EACzH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,sBAAsB,SAAiB,cAAuB;AAC5E,MAAI,CAAC,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,SAAS,uCAAuC;AACtH,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,UAAU,cAAc,UAAU,OAAO;AAC/C,aAAS,QAAQ,8CAA8C,EAAE,IAAI,QAAQ,EAAE;AAC/E,aAAS,QAAQ,uDAAuD,EAAE,IAAI,OAAO,GAAG,QAAQ,EAAE;AAClG,WAAO,EAAE,IAAI,MAAe,SAAS,oCAAoC,WAAW,WAAW,UAAU,QAAQ,EAAE,EAAE;AAAA,EACvH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,SAAiB,QAO9C;AACD,QAAM,QAAQ,YAAY,OAAO,OAAO,kBAAkB;AAC1D,QAAM,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAC3E,QAAM,WAAW,CAAC,GAAG,IAAI,KAAK,OAAO,YAAY,CAAC,GAAG,IAAI,aAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACpG,QAAM,QAAQA,gBAAe,OAAO,WAAW,OAAO;AACtD,QAAM,UAAU,EAAE,UAAU,WAAW,OAAO,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ;AACvF,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAe,QAAQ,MAAe,SAAS,2BAA2B,KAAK,IAAI,QAAQ;AAClI,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,KAAK,mBAAmB,UAAU,SAAS,EAAE,WAAW,OAAO,KAAK,MAAM,UAAU,MAAM,CAAC;AACjG,oBAAgB,UAAU,IAAI,SAAS,IAAI,CAAC,SAAS,WAAW;AAAA,MAC9D;AAAA,MACA,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,MAAM;AAAA,MACN,gBAAgB,eAAe,KAAK;AAAA,IACtC,EAAE,CAAC;AACH,WAAO,EAAE,IAAI,MAAe,SAAS,oBAAoB,KAAK,IAAI,YAAY,WAAW,UAAU,EAAE,EAAE;AAAA,EACzG,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,gBAAgB,UAAwB,SAAiBI,QAAmC;AACnG,MAAIA,QAAO;AACT,UAAM,QAAQ,WAAW,UAAUA,MAAK;AACxC,QAAI,OAAO,YAAY,WAAW,MAAM,SAAS,YAAY,MAAM,WAAW,SAAU,QAAO;AAC/F,UAAM,IAAI,oBAAoB,8BAA8BA,MAAK,IAAI,GAAG;AAAA,EAC1E;AACA,QAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAK7B,EAAE,IAAI,OAAO;AACd,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,oBAAoB,mCAAmC,OAAO,IAAI,GAAG;AACtG,MAAI,KAAK,SAAS,EAAG,OAAM,IAAI,oBAAoB,yCAAyC,OAAO,mBAAmB,GAAG;AACzH,SAAOD,UAAS,UAAU,KAAK,CAAC,CAAC;AACnC;AAEO,SAAS,sBAAsB,SAAiB,QAMpD;AACD,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,IAAI,WAAS,MAAM,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAClG,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,oBAAoB,0CAA0C;AACjG,QAAM,QAAQH,gBAAe,OAAO,YAAY,OAAO;AACvD,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAMK,aAAY,gBAAgB,UAAU,SAAS,OAAO,KAAK;AACjE,UAAM,UAAU,IAAI,IAAIA,WAAU,MAAM,OAAO,UAAQ,KAAK,eAAe,EAAE,IAAI,UAAQ,CAAC,KAAK,iBAAiB,IAAI,CAAC,CAAC;AACtH,UAAM,UAAU,OAAO,OAAO,WAAS,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC1D,QAAI,QAAQ,SAAS,EAAG,OAAM,IAAI,oBAAoB,gCAAgCA,WAAU,KAAK,KAAK,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG;AACnI,UAAM,SAAS,OAAO,IAAI,WAAS,QAAQ,IAAI,KAAK,CAAE;AACtD,UAAM,aAAa,OAAO;AAC1B,QAAI,CAAC,OAAO,cAAc;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,gBAAgB,OAAO,KAAK,IAAI,CAAC,SAASA,WAAU,KAAK;AAAA,QAClE,SAAS,EAAE,QAAQ,SAAS,YAAYA,WAAU,IAAI,iBAAiB,OAAO,IAAI,UAAQ,KAAK,QAAQ,GAAG,YAAY,MAAM;AAAA,MAC9H;AAAA,IACF;AACA,aAAS,QAAQ,uHAAuH,EACrI,IAAI,YAAY,YAAYA,WAAU,EAAE;AAC3C,UAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI/B;AACD,eAAW,SAAS,OAAQ,QAAO,IAAI,OAAO,YAAY,OAAO,SAAS,MAAM,YAAYA,WAAU,IAAI,KAAK;AAC/G,UAAM,UAAU,cAAc,UAAU,OAAO;AAC/C,oBAAgB,UAAU,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,WAAW;AAAA,MACjE,SAAS,KAAK;AAAA,MACd,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B,UAAU;AAAA,MACV,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,gBAAgB,KAAK;AAAA,IACvB,EAAE,CAAC;AACH,aAAS,QAAQ,6DAA6D,EAAE,IAAI,YAAYA,WAAU,IAAI,QAAQ,EAAE;AACxH,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,YAAY,OAAO,KAAK,IAAI,CAAC,SAASA,WAAU,KAAK;AAAA,MAC9D,SAAS,WAAW,UAAU,QAAQ,EAAE;AAAA,MACxC,YAAY,WAAW,UAAUA,WAAU,EAAE;AAAA,IAC/C;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAWO,SAAS,qBAAqBC,cAAqG;AACxI,QAAM,SAAS,QAAQ,OAAO;AAC9B,QAAMC,cAAa,CAAC,YAClB,CAAC,KAAK,KAAK,SAAS;AAAE,YAAQ,QAAQ,QAAQ,KAAK,GAAG,CAAC,EAAE,MAAM,IAAI;AAAA,EAAG;AACxE,SAAO,IAAI,KAAKA,YAAW,CAAC,KAAK,QAAQ;AACvC,QAAI,KAAK,0BAA0BD,aAAY,GAAG,CAAC,CAAC;AAAA,EACtD,CAAC,CAAC;AACF,SAAO,KAAK,YAAYC,YAAW,CAAC,KAAK,QAAQ;AAC/C,UAAM,MAAM,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;AAC9G,QAAI,KAAK,oBAAoBD,aAAY,GAAG,GAAG;AAAA,MAC7C,UAAU;AAAA,MACV,cAAc,IAAI,KAAK,iBAAiB;AAAA,MACxC,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,YAAY,IAAI,KAAK,eAAe,WAAW,IAAI,KAAK,eAAe,WAAW,IAAI,KAAK,aAAa;AAAA,IAC1G,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACF,SAAO,KAAK,kBAAkBC,YAAW,CAAC,KAAK,QAAQ;AACrD,QAAI,KAAK,sBAAsBD,aAAY,GAAG,GAAG,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAClF,CAAC,CAAC;AACF,SAAO,KAAK,gBAAgBC,YAAW,CAAC,KAAK,QAAQ;AACnD,QAAI,KAAK,gBAAgBD,aAAY,GAAG,GAAG;AAAA,MACzC,UAAU,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC;AAAA,MAC9E,cAAc,IAAI,KAAK,iBAAiB;AAAA,MACxC,WAAW,IAAI,KAAK,cAAc,WAAW,IAAI,KAAK,cAAc,WAAW,IAAI,KAAK,YAAY;AAAA,MACpG,KAAK,OAAO,IAAI,KAAK,QAAQ,WAAW,IAAI,KAAK,MAAM;AAAA,MACvD,OAAO,OAAO,IAAI,KAAK,SAAS,kBAAkB;AAAA,MAClD,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,IAC/D,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACF,SAAO,IAAI,uBAAuBC,YAAW,CAAC,KAAK,QAAQ;AAAE,QAAI,KAAK,EAAE,IAAI,MAAM,SAASD,aAAY,GAAG,GAAG,YAAY,iBAAiBA,aAAY,GAAG,GAAG,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,EAAG,CAAC,CAAC;AACpL,SAAO,KAAK,wBAAwBC,YAAW,CAAC,KAAK,QAAQ;AAAE,QAAI,KAAK,iBAAiBD,aAAY,GAAG,GAAG,OAAO,IAAI,KAAK,SAAS,EAAE,GAAG,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAAG,CAAC,CAAC;AAC7K,SAAO,KAAK,yBAAyBC,YAAW,CAAC,KAAK,QAAQ;AAAE,QAAI,KAAK,kBAAkBD,aAAY,GAAG,GAAG,OAAO,IAAI,KAAK,SAAS,EAAE,GAAG,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAAG,CAAC,CAAC;AAC/K,SAAO,KAAK,uBAAuBC,YAAW,CAAC,KAAK,QAAQ;AAC1D,UAAM,SAAS,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,EAAE,MAAM,GAAG;AACrH,QAAI,KAAK,sBAAsBD,aAAY,GAAG,GAAG;AAAA,MAC/C,cAAc,IAAI,KAAK,iBAAiB;AAAA,MACxC;AAAA,MACA,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,YAAY,IAAI,KAAK,eAAe,WAAW,IAAI,KAAK,eAAe,WAAW,IAAI,KAAK,aAAa;AAAA,MACxG,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,IAC/D,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACF,SAAO;AACT;;;ACxXO,SAAS,sBAAsB,KAA0C;AAC9E,QAAM,SAAS,IAAI,OAAO,uBAAuB;AACjD,MAAI,OAAQ,QAAO;AACnB,SAAO,OAAO,IAAI,MAAM,eAAe,WAAW,IAAI,KAAK,aAAa;AAC1E;AAEA,SAAS,WAAW,KAAsB,KAAiC;AACzE,QAAM,QAAS,IAAI,KAAiC,GAAG;AACvD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,SAAS,KAAsB,KAAsB;AAC5D,SAAQ,IAAI,KAAiC,GAAG,MAAM;AACxD;AAEO,SAAS,yBAAyBE,MAAsBC,cAA0BC,aAA8B;AACrH,EAAAF,KAAI,IAAI,qBAAqBE,YAAW,CAAC,KAAK,QAAQ;AACpD,UAAM,UAAU,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU;AAC5E,QAAI,KAAK,gBAAgB,OAAO,CAAC;AAAA,EACnC,CAAC,CAAC;AAEF,EAAAF,KAAI,KAAK,qBAAqBE,YAAW,CAAC,KAAK,QAAQ;AACrD,QAAI,KAAK,iBAAiB;AAAA,MACxB,SAAS,WAAW,KAAK,SAAS;AAAA,MAClC,WAAW,WAAW,KAAK,WAAW;AAAA,MACtC,WAAW,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,YAAY,KAAK;AAAA,MAC5E,SAAS,WAAW,KAAK,SAAS;AAAA,MAClC,OAAO,SAAS,KAAK,OAAO;AAAA,MAC5B,UAAU,OAAO,IAAI,KAAK,aAAa,YAAY,IAAI,KAAK,aAAa,OAAO,IAAI,KAAK,WAAsC;AAAA,MAC/H,SAASD,aAAY,EAAE,MAAM,IAAI,MAAiC,OAAO,IAAI,MAAM,CAAC;AAAA,MACpF,QAAQ,WAAW,KAAK,QAAQ;AAAA,MAChC,WAAY,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,YAAY,KAAK;AAAA,MAC7E,UAAU,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,WAAW,KAAK;AAAA,MACzE,aAAa,WAAW,KAAK,aAAa,KAAK,WAAW,KAAK,cAAc;AAAA,MAC7E,UAAU,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,WAAW;AAAA,MACpE,YAAY,cAAc,WAAW,KAAK,KAAK,CAAC;AAAA,IAClD,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,8BAA8BE,YAAW,CAAC,KAAK,QAAQ;AAC7D,QAAI,KAAK,kBAAkB,IAAI,OAAO,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU,MAAS,CAAC;AAAA,EACvH,CAAC,CAAC;AAEF,EAAAF,KAAI,KAAK,wCAAwCE,YAAW,CAAC,KAAK,QAAQ;AACxE,UAAM,aAAa,sBAAsB,GAAG;AAC5C,QAAI,CAAC,WAAY,OAAM,IAAI,gBAAgB,iCAAiC,KAAK,sBAAsB;AACvG,QAAI,KAAK,oBAAoB,YAAY,cAAc,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,EACjF,CAAC,CAAC;AAEF,EAAAF,KAAI,KAAK,sCAAsCE,YAAW,CAAC,KAAK,QAAQ;AACtE,UAAM,aAAa,sBAAsB,GAAG;AAC5C,QAAI,CAAC,WAAY,OAAM,IAAI,gBAAgB,+BAA+B,KAAK,sBAAsB;AACrG,QAAI,KAAK,kBAAkB,UAAU,CAAC;AAAA,EACxC,CAAC,CAAC;AAEF,EAAAF,KAAI,KAAK,4CAA4CE,YAAW,CAAC,KAAK,QAAQ;AAC5E,QAAI,KAAK,uBAAuBD,aAAY,EAAE,MAAM,IAAI,MAAiC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,SAAS;AAAA,MAChI,OAAO,WAAW,KAAK,OAAO,KAAK;AAAA,MACnC,cAAc,SAAS,KAAK,cAAc;AAAA,MAC1C,QAAQ,WAAW,KAAK,QAAQ;AAAA,IAClC,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,qCAAqCE,YAAW,CAAC,KAAK,QAAQ;AACrE,QAAI,KAAK,iBAAiBD,aAAY,EAAE,MAAM,IAAI,MAAiC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,SAAS;AAAA,MAC1H,OAAO,WAAW,KAAK,OAAO,KAAK;AAAA,MACnC,cAAc,SAAS,KAAK,cAAc;AAAA,MAC1C,QAAQ,WAAW,KAAK,QAAQ;AAAA,IAClC,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,uCAAuCE,YAAW,CAAC,KAAK,QAAQ;AACvE,QAAI,KAAK,mBAAmBD,aAAY,EAAE,MAAM,IAAI,MAAiC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,SAAS;AAAA,MAC5H,OAAO,WAAW,KAAK,OAAO,KAAK;AAAA,MACnC,cAAc,SAAS,KAAK,cAAc;AAAA,MAC1C,QAAQ,WAAW,KAAK,QAAQ;AAAA,MAChC,aAAa,WAAW,KAAK,aAAa,KAAK,WAAW,KAAK,eAAe,KAAK;AAAA,IACrF,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACJ;;;AClEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,uBAAuB,OAA+C;AACpF,SAAO,iBAAiB;AAC1B;AAEA,IAAM,cAAmC;AAAA,EACvC;AAAA,IACE,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY,aAAW;AACrB,UAAI,YAAY,eAAgB,QAAO,EAAE,QAAQ,IAAI,MAAM,yBAAyB,QAAQ,GAAG;AAC/F,YAAM,UAAU,aAAa,EAAE,KAAK,UAAQ,KAAK,YAAY,OAAO;AACpE,aAAO,EAAE,QAAQ,SAAS,kBAAkB,IAAI,QAAQ,SAAS,kBAAkB,GAAG;AAAA,IACxF;AAAA,IACA,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY,OAAO,EAAE,aAAa,UAAU;AAAA,IAC5C,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY,OAAO,EAAE,2BAA2B,MAAM,uBAAuB,GAAG,UAAU,SAAS;AAAA,IACnG,YAAY;AAAA,EACd;AACF;AAEA,SAASE,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAAS,cAAc,aAA0B,UAA8C;AAC7F,QAAM,aAAa,YAAY,KAAK,UAAQ,KAAK,iBAAiB,eAAe,KAAK,aAAa,QAAQ;AAC3G,MAAI,CAAC,WAAY,OAAM,IAAI,qBAAqB,gCAAgC,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC9G,SAAO;AACT;AAEA,SAAS,aAAa,UAAwB,SAAuB;AACnE,EAAAA,eAAc,UAAU,OAAO;AAC/B,QAAM,YAAY,OAAO;AACzB,aAAW,cAAc,aAAa;AACpC,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKhB,EAAE;AAAA,MACD;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW,kBAAkB,IAAI;AAAA,MACjC,WAAW;AAAA,MACX,KAAK,UAAU,WAAW,WAAW,OAAO,CAAC;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAwC;AAC3D,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAAI,SAAoC,CAAC;AAAA,EAC/G,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,cAAc,UAA2B,KAAwB;AACxE,MAAI,aAAa,MAAM;AACrB,WAAO,EAAE,UAAU,OAAO,OAAO,uCAAuC,YAAY,KAAK;AAAA,EAC3F;AACA,MAAI,aAAa,UAAU;AACzB,UAAM,WAAW,QAAQ,IAAI,2BAA2B,IAAI,iCAAiC;AAC7F,WAAO,EAAE,UAAU,OAAO,+DAA+D,YAAY,8BAA8B;AAAA,EACrI;AACA,SAAO,EAAE,UAAU,MAAM,OAAO,+BAA+B,YAAY,KAAK;AAClF;AAEA,SAAS,aAAa,UAA2B,SAAkB,QAAiC,YAA8C;AAChJ,MAAI,aAAa,MAAM;AACrB,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,OAAO,UAAU,OAAO,SAAS,eAAe;AAAA,EACzD;AACA,MAAI,aAAa,UAAU;AACzB,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,WAAW,WAAW,eAAe;AAAA,EAC9C;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,WAAW,WAAW,eAAe;AAC9C;AAEA,SAAS,eAAe,KAAwB,KAAwC;AACtF,QAAM,aAAa,cAAc,IAAI,cAAc,IAAI,QAAQ;AAC/D,QAAM,aAAa,cAAc,IAAI,UAAU,GAAG;AAClD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,aAAa,YAAY,IAAI,gBAAgB;AACnD,SAAO;AAAA,IACL,cAAc,IAAI;AAAA,IAClB;AAAA,IACA,aAAa,WAAW;AAAA,IACxB;AAAA,IACA,eAAe,aAAa,IAAI,UAAU,SAAS,YAAY,UAAU;AAAA,IACzE,OAAO,WAAW;AAAA,IAClB,UAAU,IAAI;AAAA,IACd,aAAa;AAAA,IACb,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,SAAS,uBAAuB,QAAuC;AACrE,QAAM,UAAU,CAAC,UAAU,SAAS,YAAY,cAAc,WAAW,QAAQ;AACjF,QAAM,QAAQ,CAAC,OAAgB,SAAyB;AACtD,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC3E,YAAM,aAAa,IAAI,YAAY,EAAE,QAAQ,cAAc,EAAE;AAC7D,UAAI,QAAQ,KAAK,UAAQ,WAAW,SAAS,KAAK,QAAQ,cAAc,EAAE,CAAC,CAAC,GAAG;AAC7E,cAAM,IAAI,qBAAqB,mDAAmD,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,MAC9G;AACA,YAAM,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,CAAC;AAClB;AAEO,SAAS,mBAAmB,UAAU,gBAAgB,MAAyB,QAAQ,KAA8B;AAC1H,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,iBAAa,UAAU,OAAO;AAC9B,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK7B,EAAE,IAAI,OAAO;AACd,WAAO,EAAE,WAAW,OAAO,GAAG,SAAS,UAAU,KAAK,IAAI,SAAO,eAAe,KAAK,GAAG,CAAC,EAAE;AAAA,EAC7F,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,qBAAqB,UAAU,gBAAgB,QAAoC,MAAyB,QAAQ,KAAqB;AACvJ,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,qBAAqB,oDAAoD;AAC7G,QAAM,aAAa,cAAc,OAAO,aAAa,OAAO,QAAQ;AACpE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,iBAAa,UAAU,OAAO;AAC9B,UAAM,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA,KAGhC,EAAE,IAAI,SAAS,OAAO,aAAa,OAAO,QAAQ;AACnD,UAAM,aAAa,OAAO,cAAc,YAAY,SAAS,oBAAoB,IAAI,KAAK,WAAW,WAAW,OAAO;AACvH,2BAAuB,UAAU;AACjC,UAAM,YAAY,OAAO;AACzB,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,OAAO,UAAU,IAAI,GAAG,KAAK,UAAU,UAAU,GAAG,WAAW,YAAY,WAAW,SAAS,OAAO,aAAa,OAAO,QAAQ;AACzI,UAAM,MAAM,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI5B,EAAE,IAAI,SAAS,OAAO,aAAa,OAAO,QAAQ;AACnD,WAAO,eAAe,KAAK,GAAG;AAAA,EAChC,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;ACrNA,SAAS,cAAc,KAAkC;AACvD,SAAO,CAAC,2BAA2B,mCAAmC,EAAE,OAAO,SAAO,CAAC,IAAI,GAAG,CAAC;AACjG;AAEA,SAAS,YAAY,SAAuC;AAC1D,QAAM,OAAO,QAAQ,KAAK,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK;AAClE,QAAM,MAAM,QAAQ,KAAK,KAAK,KAAK;AACnC,QAAM,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,OAAO;AACxC,QAAM,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK;AACrC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,8BAA8B;AACzD,SAAO;AACT;AAEO,SAAS,uBAAuB,SAAwD;AAC7F,QAAM,YAAY,QAAQ,OAAO,UAAU,KAAK;AAChD,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,8BAA8B;AAC9D,QAAM,cAAc,QAAQ,KAAK,cAAc,KAAK;AACpD,QAAM,UAAmC;AAAA,IACvC;AAAA,IACA,MAAM,cAAc,aAAa;AAAA,IACjC,gBAAgB,cAAc,cAAc;AAAA,IAC5C,MAAM,YAAY,OAAO;AAAA,EAC3B;AACA,MAAI,YAAa,SAAQ,cAAc;AACvC,QAAM,SAAS,QAAQ,UAAU,CAAC,GAC/B,OAAO,WAAS,MAAM,IAAI,KAAK,CAAC,EAChC,IAAI,YAAU;AAAA,IACb,SAAS,MAAM,WAAW,MAAM;AAAA,IAChC,KAAK,MAAM;AAAA,EACb,EAAE;AACJ,MAAI,MAAM,SAAS,EAAG,SAAQ,QAAQ;AACtC,SAAO;AACT;AAEO,SAAS,2BAA2B,MAAwD;AACjG,SAAO;AAAA,IACL,WAAW,SAAoD;AAC7D,YAAM,UAAU,uBAAuB,OAAO;AAC9C,YAAM,YAAY,KAAK,aAAa,OAAO;AAC3C,YAAM,UAAU,CAAC,SAAS,UAAU,WAAW,WAAW,aAAa,YAAY,MAAM;AACzF,YAAM,SAAS,KAAK,UAAU,OAAO;AACrC,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,OAAO,OAAO,KAAK,IAAI,KAAK,MAAM,OAAO,MAAM,IAAe;AAAA,QACtE;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,WAAkB;AAChB,YAAM,IAAI,MAAM,iIAAiI;AAAA,IACnJ;AAAA,IAEA,SAA+B;AAC7B,YAAM,UAAU,cAAc,KAAK,OAAO,QAAQ,GAAG;AACrD,aAAO;AAAA,QACL,aAAa;AAAA,QACb,UAAU;AAAA,QACV,YAAY,QAAQ,WAAW;AAAA,QAC/B;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;ACtEO,SAAS,iBAAiB,SAAiB,MAAyB,QAAQ,KAAK;AACtF,QAAM,UAAU,aAAa,EAAE,KAAK,UAAQ,KAAK,YAAY,OAAO,MAAM,YAAY,iBAAiB,gBAAgB,OAAO,IAAI;AAClI,QAAM,SAAS,2BAA2B;AAAA,IACxC;AAAA,IACA,WAAW,OAAO,EAAE,QAAQ,MAAM,QAAQ,GAAG;AAAA,IAC7C,cAAc,MAAM;AAAA,EACtB,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAAS,YAAY,iBACjB,CAAC;AAAA,MACC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB,CAAC,IACD,CAAC;AAAA,MACC,UAAU;AAAA,MACV,YAAY,QAAQ,SAAS,kBAAkB,SAAS,cAAc;AAAA,MACtE,UAAU,QAAQ,SAAS,kBAAkB,SAAS,cAAc;AAAA,MACpE,YAAY,QAAQ,SAAS,kBAAkB,SAAS,cAAc;AAAA,MACtE,MAAM;AAAA,MACN,gBAAgB,SAAS,kBAAkB;AAAA,MAC3C,gBAAgB,SAAS,kBAAkB;AAAA,IAC7C,CAAC;AAAA,IACL,SAAS,CAAC,OAAO,OAAO,CAAC;AAAA,EAC3B;AACF;;;AClCA,SAAS,aAAAC,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,QAAAC,aAAY;;;ACCd,SAAS,iBAAiB,MAAyC;AACxE,MAAI,KAAK,UAAU,aAAa,KAAK,UAAU,WAAY,QAAO;AAClE,MAAI,KAAK,UAAU,SAAU,QAAO;AACpC,MAAI,KAAK,UAAU,YAAa,QAAO;AACvC,MAAI,KAAK,UAAU,SAAU,QAAO;AACpC,SAAO,KAAK,OAAO,WAAW,IAAI,gBAAgB;AACpD;AAEO,SAAS,mBAAmB,SAAiB,MAA0C;AAC5F,QAAM,SAAS;AACf,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,UAAU,MAAM;AACtB,SAAO;AAAA,IACL,aAAa,OACT,mCAAmC,KAAK,KAAK,KAAK,KAAK,EAAE,QAAQ,KAAK,OAAO,sIAC7E;AAAA,IACJ,qBAAqB,GAAG,MAAM,gCAAgC,OAAO,cAAc,MAAM;AAAA,IACzF,oBAAoB,GAAG,MAAM,2BAA2B,OAAO;AAAA,IAC/D,GAAI,UAAU,EAAE,qBAAqB,GAAG,MAAM,4BAA4B,OAAO,eAAe,OAAO,UAAU,IAAI,CAAC;AAAA,IACtH,sBAAsB,GAAG,MAAM,6BAA6B,OAAO;AAAA,IACnE,oBAAoB,GAAG,MAAM,yBAAyB,OAAO,cAAc,MAAM;AAAA,IACjF,qBAAqB,GAAG,MAAM,yBAAyB,OAAO,cAAc,MAAM;AAAA,IAClF,kBAAkB,GAAG,MAAM,yBAAyB,OAAO,cAAc,MAAM;AAAA,IAC/E,mBAAmB,GAAG,MAAM,yBAAyB,OAAO,cAAc,MAAM;AAAA,EAClF;AACF;;;ACVA,IAAM,SAAS,oBAAI,IAAsB,CAAC,SAAS,UAAU,aAAa,UAAU,WAAW,UAAU,CAAC;AAEnG,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,iBAAiB;AAC1B;AAEA,SAASC,eAAc,UAAwB,SAAuB;AACpE,QAAM,YAAY,OAAO;AACzB,WAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhB,EAAE,IAAI,SAAS,SAAS,WAAW,SAAS;AAC/C;AAEA,SAASC,aAAY,OAA2B,OAAuB;AACrE,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,CAAC,KAAM,OAAM,IAAI,kBAAkB,WAAW,KAAK,cAAc;AACrE,SAAO;AACT;AAEA,SAAS,eAAe,OAA6C;AACnE,QAAM,SAAS,SAAS,SAAS,QAAQ,MAAM,GAAG;AAClD,MAAI,CAAC,OAAO,IAAI,KAAK,EAAG,OAAM,IAAI,kBAAkB,mCAAmC,KAAK,EAAE;AAC9F,SAAO;AACT;AAEA,SAAS,aAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,IAC5D,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,QAAQ,IAAI,WAAW,aAAa,aAAa;AAAA,IACjD,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,aAAa,KAAgD;AACpE,SAAO;AAAA,IACL,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,aAAa,OAAO,IAAI,WAAW;AAAA,EACrC;AACF;AAEA,SAAS,YAAY,KAA8B,QAAyC;AAC1F,QAAM,OAAO,SAAS,KAAK,MAAM;AACjC,SAAO,EAAE,GAAG,MAAM,SAAS,mBAAmB,KAAK,SAAS,IAAI,GAAG,WAAW,iBAAiB,IAAI,EAAE;AACvG;AAEA,SAAS,SAAS,KAA8B,QAAyC;AACvF,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,OAAO,eAAe,OAAO,IAAI,KAAK,CAAC;AAAA,IACvC,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,IAC5D,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM;AAAA,IAC7C,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,IACxE,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IAC/D,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM;AAAA,IAC7C,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAAwB,SAAiB,SAAgC;AAC9F,QAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAI7B,EAAE,IAAI,SAAS,OAAO;AACvB,SAAO,KAAK,IAAI,SAAO,YAAY,KAAK,cAAc,UAAU,SAAS,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3F;AAEA,SAAS,cAAc,UAAwB,SAAiB,QAAoC;AAClG,SAAQ,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKxB,EAAE,IAAI,SAAS,MAAM,EAAgC,IAAI,YAAY;AACxE;AAEA,SAAS,YAAY,OAAwD;AAC3E,SAAO,OAAO,YAAY,CAAC,GAAG,MAAM,EAAE,IAAI,WAAS,CAAC,OAAO,MAAM,OAAO,UAAQ,KAAK,UAAU,KAAK,EAAE,MAAM,CAAC,CAAC;AAChH;AAEA,SAASC,SAAQ,SAAiB,SAAgD;AAChF,QAAM,SAAS;AACf,SAAO;AAAA,IACL,gBAAgB,GAAG,MAAM,4BAA4B,OAAO,eAAe,OAAO;AAAA,IAClF,oBAAoB,GAAG,MAAM,0BAA0B,OAAO,eAAe,OAAO;AAAA,IACpF,qBAAqB,GAAG,MAAM,gCAAgC,OAAO;AAAA,IACrE,eAAe,GAAG,MAAM,yBAAyB,OAAO;AAAA,EAC1D;AACF;AAEO,SAAS,mBAAmB,SAAuC;AACxE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI7B,EAAE,IAAI,OAAO;AACd,UAAM,UAAU,KAAK,IAAI,SAAO;AAC9B,YAAM,QAAQ,aAAa,GAAG;AAC9B,YAAM,QAAQ,cAAc,UAAU,SAAS,MAAM,EAAE;AACvD,aAAO,EAAE,GAAG,OAAO,YAAY,MAAM,QAAQ,cAAc,YAAY,KAAK,EAAE;AAAA,IAChF,CAAC;AACD,WAAO,EAAE,SAAS,WAAW,OAAO,GAAG,QAAQ;AAAA,EACjD,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,SAAiB,SAAqC;AACpF,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,MAAM,SAAS,QAAQ,+DAA+D,EAAE,IAAI,SAAS,OAAO;AAClH,QAAI,CAAC,IAAK,OAAM,IAAI,kBAAkB,0BAA0B,OAAO,IAAI,GAAG;AAC9E,UAAM,QAAQ,aAAa,GAAG;AAC9B,WAAO,EAAE,SAAS,WAAW,OAAO,GAAG,OAAO,OAAO,cAAc,UAAU,SAAS,MAAM,EAAE,GAAG,SAASA,SAAQ,SAAS,MAAM,EAAE,EAAE;AAAA,EACvI,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB,SAAiB,QAA4B;AAC9E,QAAM,UAAUD,aAAY,OAAO,SAAS,UAAU;AACtD,QAAM,UAAU,EAAE,IAAI,SAAS,SAAS,OAAOA,aAAY,OAAO,OAAO,aAAa,GAAG,UAAU,OAAO,UAAU,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM;AACjK,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,8BAA8B,OAAO,IAAI,QAAQ;AACrH,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,IAAAD,eAAc,UAAU,OAAO;AAC/B,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMhB,EAAE,IAAI,SAAS,SAAS,QAAQ,OAAO,OAAO,YAAY,MAAM,OAAO,WAAW,MAAM,OAAO,SAAS,MAAM,WAAW,SAAS;AACnI,WAAO,EAAE,IAAI,MAAM,SAAS,uBAAuB,OAAO,IAAI,OAAO,gBAAgB,SAAS,OAAO,EAAE,MAAM;AAAA,EAC/G,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiB,QAA2B;AAC5E,QAAM,SAASC,aAAY,OAAO,QAAQ,SAAS;AACnD,QAAM,UAAUA,aAAY,OAAO,SAAS,UAAU;AACtD,QAAM,QAAQ,eAAe,OAAO,KAAK;AACzC,QAAM,UAAU,EAAE,GAAG,QAAQ,QAAQ,SAAS,OAAO,SAAS,OAAOA,aAAY,OAAO,OAAO,YAAY,GAAG,SAASA,aAAY,OAAO,SAAS,cAAc,EAAE;AACnK,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,6BAA6B,MAAM,IAAI,QAAQ;AACnH,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,IAAAD,eAAc,UAAU,OAAO;AAC/B,UAAM,QAAQ,SAAS,QAAQ,gEAAgE,EAAE,IAAI,SAAS,OAAO;AACrH,QAAI,CAAC,MAAO,OAAM,IAAI,kBAAkB,0BAA0B,OAAO,IAAI,GAAG;AAChF,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWhB,EAAE,IAAI,QAAQ,SAAS,SAAS,QAAQ,SAAS,QAAQ,OAAO,OAAO,OAAO,YAAY,MAAM,OAAO,QAAQ,MAAM,OAAO,OAAO,MAAM,OAAO,eAAe,MAAM,OAAO,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,SAAS,MAAM,OAAO,cAAc,MAAM,WAAW,SAAS;AACxR,WAAO,EAAE,IAAI,MAAM,SAAS,sBAAsB,MAAM,IAAI,MAAM,gBAAgB,UAAU,SAAS,MAAM,EAAE;AAAA,EAC/G,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,gBAAgB,UAAwB,SAAiB,QAA6B;AAC7F,QAAM,MAAM,SAAS,QAAQ,6DAA6D,EAAE,IAAI,SAAS,MAAM;AAC/G,MAAI,CAAC,IAAK,OAAM,IAAI,kBAAkB,yBAAyB,MAAM,IAAI,GAAG;AAC5E,SAAO,YAAY,KAAK,cAAc,UAAU,SAAS,MAAM,CAAC;AAClE;AAEO,SAAS,wBAAwB,SAAiB,MAAmB,YAAgC,WAAyB;AACnI,MAAI,CAAC,cAAc,CAAC,0BAA0B,SAAS,IAAI,EAAG;AAC9D,QAAM,aAAa,2BAA2B;AAAA,IAC5C,SAAS,KAAK;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,aAAa;AAAA,IACb;AAAA,IACA,WAAW;AAAA,IACX,UAAU,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AACD,MAAI,CAAC,WAAW,IAAI;AAClB,UAAM,SAAS,WAAW,SAAS,oBAAoB,WAAW,SAAS,wBAAwB,MAAM;AACzG,UAAM,IAAI,gBAAgB,WAAW,SAAS,QAAQ,WAAW,MAAM,WAAW,SAAS;AAAA,EAC7F;AACF;AAEA,SAAS,0BAA0B,SAAiB,MAA4B;AAC9E,SAAO,gBAAgB,OAAO,EAAE,OAAO,KAAK,WAAS;AACnD,QAAI,MAAM,YAAY,WAAW,MAAM,WAAW,YAAY,MAAM,kBAAkB,UAAW,QAAO;AACxG,QAAI,MAAM,eAAe,eAAgB,QAAO,MAAM,cAAc,KAAK;AACzE,WAAO,MAAM,eAAe,sBAAsB,CAAC,MAAM,WAAW,MAAM,YAAY,KAAK;AAAA,EAC7F,CAAC;AACH;AAEO,SAAS,iBAAiB,SAAiB,UAAkE,CAAC,GAAG;AACtH,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI7B,EAAE,IAAI,OAAO;AACd,UAAM,QAAQ,KAAK,IAAI,SAAO,YAAY,KAAK,cAAc,UAAU,SAAS,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAC7F,OAAO,UAAQ,CAAC,QAAQ,WAAW,KAAK,aAAa,QAAQ,OAAO,EACpE,OAAO,UAAQ,CAAC,QAAQ,WAAW,KAAK,YAAY,QAAQ,OAAO,EACnE,OAAO,UAAQ,CAAC,QAAQ,SAAS,KAAK,UAAU,eAAe,QAAQ,KAAK,CAAC;AAChF,WAAO,EAAE,SAAS,WAAW,OAAO,GAAG,MAAM;AAAA,EAC/C,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,SAAiB,QAAiC;AAClF,QAAM,SAASC,aAAY,OAAO,QAAQ,SAAS;AACnD,QAAM,QAAQ,OAAO,QAAQ,eAAe,OAAO,KAAK,IAAI;AAC5D,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,6BAA6B,MAAM,IAAI,SAAS,EAAE,GAAG,QAAQ,OAAO,QAAQ,EAAE;AAClJ,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,UAAM,UAAU,gBAAgB,UAAU,SAAS,MAAM;AACzD,4BAAwB,SAAS,SAAS,OAAO,YAAY,OAAO,QAAQ,uBAAuB,qBAAqB;AACxH,QAAI,OAAO,SAAS;AAClB,YAAM,QAAQ,SAAS,QAAQ,gEAAgE,EAAE,IAAI,SAAS,OAAO,OAAO;AAC5H,UAAI,CAAC,MAAO,OAAM,IAAI,kBAAkB,0BAA0B,OAAO,OAAO,IAAI,GAAG;AAAA,IACzF;AACA,UAAM,OAAO;AAAA,MACX,SAAS,OAAO,WAAW,QAAQ;AAAA,MACnC,MAAM,OAAO,QAAQ,QAAQ;AAAA,MAC7B,UAAU,OAAO,YAAY,QAAQ;AAAA,MACrC,SAAS,OAAO,WAAW,QAAQ;AAAA,MACnC,KAAK,OAAO,OAAO,QAAQ;AAAA,MAC3B,OAAO,OAAO,SAAS,QAAQ;AAAA,MAC/B,OAAO,SAAS,QAAQ;AAAA,MACxB,UAAU,OAAO,YAAY,QAAQ;AAAA,MACrC,aAAa,OAAO,eAAe,QAAQ;AAAA,MAC3C,YAAY,OAAO,cAAc,QAAQ;AAAA,MACzC,OAAO,OAAO,SAAS,QAAQ;AAAA,MAC/B,KAAK,OAAO,OAAO,QAAQ;AAAA,IAC7B;AACA,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKhB,EAAE,IAAI,KAAK,SAAS,KAAK,SAAS,KAAK,OAAO,KAAK,OAAO,KAAK,YAAY,MAAM,KAAK,QAAQ,MAAM,KAAK,OAAO,MAAM,KAAK,eAAe,MAAM,KAAK,YAAY,MAAM,KAAK,OAAO,MAAM,KAAK,SAAS,MAAM,KAAK,cAAc,MAAM,WAAW,SAAS,MAAM;AACjQ,WAAO,EAAE,IAAI,MAAM,SAAS,wBAAwB,MAAM,IAAI,MAAM,gBAAgB,UAAU,SAAS,MAAM,EAAE;AAAA,EACjH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,uBAAuB,SAAiB,QAAgC;AACtF,QAAM,SAASA,aAAY,OAAO,QAAQ,SAAS;AACnD,QAAM,UAAUA,aAAY,OAAO,SAAS,UAAU;AACtD,QAAM,OAAO,OAAO,MAAM,KAAK,KAAK;AACpC,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,gBAAgB,OAAO,OAAO,MAAM,IAAI,SAAS,EAAE,QAAQ,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AACpK,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,UAAM,UAAU,gBAAgB,UAAU,SAAS,MAAM;AACzD,4BAAwB,SAAS,SAAS,OAAO,YAAY,2BAA2B;AACxF,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,GAAG,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,IAAI,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS,MAAM,SAAS;AACjH,WAAO,EAAE,IAAI,MAAM,SAAS,YAAY,OAAO,OAAO,MAAM,IAAI,MAAM,gBAAgB,UAAU,SAAS,MAAM,EAAE;AAAA,EACnH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,uBAAuB,SAAiB,QAAgC;AACtF,QAAM,SAASA,aAAY,OAAO,QAAQ,SAAS;AACnD,QAAM,UAAUA,aAAY,OAAO,SAAS,UAAU;AACtD,QAAM,OAAO,OAAO,MAAM,KAAK,KAAK;AACpC,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,gBAAgB,OAAO,SAAS,MAAM,IAAI,SAAS,EAAE,QAAQ,SAAS,KAAK,EAAE;AACjJ,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,UAAU,gBAAgB,UAAU,SAAS,MAAM;AACzD,4BAAwB,SAAS,SAAS,OAAO,YAAY,2BAA2B;AACxF,aAAS,QAAQ,oGAAoG,EAAE,IAAI,SAAS,QAAQ,SAAS,IAAI;AACzJ,WAAO,EAAE,IAAI,MAAM,SAAS,YAAY,OAAO,SAAS,MAAM,IAAI,MAAM,gBAAgB,UAAU,SAAS,MAAM,EAAE;AAAA,EACrH,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;ACvUA,SAASE,cAAa,KAAgD;AACpE,SAAO;AAAA,IACL,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,aAAa,OAAO,IAAI,WAAW;AAAA,EACrC;AACF;AAEA,SAASC,cAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,IAC5D,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,QAAQ,IAAI,WAAW,aAAa,aAAa;AAAA,IACjD,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAASC,eAAc,UAAwB,SAAiB,QAAoC;AAClG,SAAQ,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIxB,EAAE,IAAI,SAAS,MAAM,EAAgC,IAAIF,aAAY;AACxE;AAEA,SAASG,aAAY,KAA8B,QAAyC;AAC1F,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,UAAU;AAAA,IAC9B,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC7B,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,IAC5D,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM;AAAA,IAC7C,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,IACxE,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IAC/D,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM;AAAA,IAC7C,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,IACnD,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,SAAS,UAAwB,SAAiB,QAA6B;AACtF,QAAM,MAAM,SAAS,QAAQ,6DAA6D,EAAE,IAAI,SAAS,MAAM;AAC/G,MAAI,CAAC,IAAK,OAAM,IAAI,kBAAkB,yBAAyB,MAAM,IAAI,GAAG;AAC5E,SAAOA,aAAY,KAAKD,eAAc,UAAU,SAAS,MAAM,CAAC;AAClE;AAEA,SAAS,UAAU,UAAwB,SAAiB,SAA+B;AACzF,QAAM,MAAM,SAAS,QAAQ,+DAA+D,EAAE,IAAI,SAAS,OAAO;AAClH,MAAI,CAAC,IAAK,OAAM,IAAI,kBAAkB,0BAA0B,OAAO,IAAI,GAAG;AAC9E,SAAOD,cAAa,GAAG;AACzB;AAIO,SAAS,iBAAiB,SAAwC;AACvE,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,MAAM,SAAS,QAAQ,8EAA8E,EAAE,IAAI,OAAO;AACxH,QAAI,CAAC,IAAK,QAAO,EAAE,WAAW,OAAO,GAAG,SAAS,mBAAmB,OAAO,GAAG,SAAS,UAAU,OAAO,QAAQ,KAAK;AACrH,UAAM,SAAS,OAAO,IAAI,OAAO;AACjC,QAAI;AACJ,QAAI;AACF,aAAO,SAAS,UAAU,SAAS,MAAM;AAAA,IAC3C,SAAS,OAAO;AACd,UAAI,iBAAiB,qBAAqB,MAAM,WAAW,KAAK;AAC9D,iBAAS,QAAQ,kDAAkD,EAAE,IAAI,OAAO;AAChF,eAAO;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,SAAS,mBAAmB,OAAO;AAAA,UACnC;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS,2BAA2B,MAAM;AAAA,QAC5C;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,WAAO;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,SAAS,mBAAmB,SAAS,IAAI;AAAA,MACzC;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,OAAO,UAAU,UAAU,SAAS,KAAK,QAAQ;AAAA,QACjD,SAAS,mBAAmB,SAAS,IAAI;AAAA,QACzC,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,QACnD;AAAA,QACA,WAAW,iBAAiB,IAAI;AAAA,QAChC,aAAa,OAAO,IAAI,WAAW;AAAA,MACrC;AAAA,IACF;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,iBAAiB,SAAiB,QAA6B;AAC7E,QAAM,SAAS,OAAO,OAAO,KAAK;AAClC,MAAI,CAAC,OAAQ,OAAM,IAAI,kBAAkB,oCAAoC;AAC7E,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,+BAA+B,MAAM,IAAI,SAAS,EAAE,QAAQ,OAAO,OAAO,MAAM,EAAE;AACtJ,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,UAAM,OAAO,SAAS,UAAU,SAAS,MAAM;AAC/C,4BAAwB,SAAS,MAAM,OAAO,YAAY,oBAAoB;AAC9E,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMhB,EAAE,IAAI,SAAS,QAAQ,OAAO,SAAS,MAAM,WAAW,SAAS;AAAA,EACpE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,EAAE,IAAI,MAAM,SAAS,2BAA2B,MAAM,IAAI,GAAG,iBAAiB,OAAO,EAAE;AAChG;AAEO,SAAS,mBAAmB,SAAiB,cAAuB,YAAqB;AAC9F,MAAI,CAAC,aAAc,QAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,SAAS,sCAAsC;AACnG,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,MAAM,SAAS,QAAQ,0DAA0D,EAAE,IAAI,OAAO;AACpG,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,cAAM,OAAO,SAAS,UAAU,SAAS,OAAO,IAAI,OAAO,CAAC;AAC5D,gCAAwB,SAAS,MAAM,YAAY,sBAAsB;AAAA,MAC3E,SAAS,OAAO;AACd,YAAI,EAAE,iBAAiB,qBAAqB,MAAM,WAAW,KAAM,OAAM;AAAA,MAC3E;AAAA,IACF;AACA,aAAS,QAAQ,kDAAkD,EAAE,IAAI,OAAO;AAAA,EAClF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,EAAE,IAAI,MAAM,SAAS,mCAAmC,GAAG,iBAAiB,OAAO,EAAE;AAC9F;;;AHvJO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,iBAAiB;AAC1B;AASA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,qBAAqB,GAAG,EAAE,QAAQ,YAAY,EAAE,KAAK;AAC5E;AAEA,SAAS,YAAY,SAAiB,QAAuF;AAC3H,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,iBAAiB,OAAO,EAAE,MAAM,KAAK,UAAQ,KAAK,OAAO,OAAO,MAAM;AACnF,QAAI,CAAC,KAAM,OAAM,IAAI,oBAAoB,yBAAyB,OAAO,MAAM,IAAI,GAAG;AACtF,WAAO,EAAE,MAAM,QAAQ,OAAO;AAAA,EAChC;AACA,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,SAAS,iBAAiB,OAAO;AACvC,QAAI,CAAC,OAAO,OAAQ,OAAM,IAAI,oBAAoB,yCAAyC,OAAO,IAAI,GAAG;AACzG,WAAO,EAAE,MAAM,OAAO,OAAO,MAAM,QAAQ,kBAAkB;AAAA,EAC/D;AACA,QAAM,IAAI,oBAAoB,mDAAmD;AACnF;AAEA,SAAS,YAAY,SAAiB,QAAwB;AAC5D,SAAOG,MAAK,UAAU,kBAAkB,mBAAmB,YAAY,OAAO,GAAG,GAAG,YAAY,MAAM,CAAC,OAAO;AAChH;AAEA,SAAS,aAAa,SAAiB,QAAgB,SAA0C;AAC/F,QAAM,OAAO,YAAY,SAAS,MAAM;AACxC,EAAAC,WAAUD,MAAK,MAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,EAAAE,eAAc,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC3D,SAAO;AACT;AAEA,SAAS,cAAc,WAA6B;AAClD,SAAO,CAAC,SAAS,UAAU,WAAW,WAAW,aAAa,YAAY,MAAM;AAClF;AAEA,SAAS,SAAmD;AAC1D,SAAO,OAAO,EAAE,QAAQ,KAAK,UAAU,EAAE,IAAI,MAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ,GAAG;AACjF;AAEO,SAAS,wBAAwB,SAAiB,QAA4B,MAAyB,QAAQ,KAAK;AACzH,MAAI,CAAC,OAAO,gBAAgB,KAAK,EAAG,OAAM,IAAI,oBAAoB,yCAAyC;AAC3G,QAAM,EAAE,MAAM,OAAO,IAAI,YAAY,SAAS,MAAM;AACpD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,uBAAuB,OAAO;AAC9C,QAAM,YAAY,aAAa,SAAS,KAAK,IAAI,OAAO;AACxD,QAAM,iBAAiB,KAAK,OAAO,IAAI,YAAU;AAAA,IAC/C,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV,EAAE;AACF,QAAM,UAAU,2BAA2B;AAAA,IACzC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,cAAc,MAAM;AAAA,EACtB,CAAC;AACD,QAAM,SAAS,QAAQ,OAAO;AAC9B,QAAM,SAAS,OAAO,UAAU,QAAQ,WAAW,OAAO,IAAI;AAAA,IAC5D,SAAS,cAAc,SAAS;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA,UAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,OAAO,YAAY;AAAA,IAC7B,UAAU;AAAA,IACV,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACN,mBAAmB,OAAO;AAAA,MAC1B,OAAO,KAAK;AAAA,IACd;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,cAAc;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,iBAAiB;AAAA,IACjB,UAAU;AAAA,MACR;AAAA,MACA,GAAI,eAAe,SAAS,IAAI,CAAC,2FAA2F,IAAI,CAAC;AAAA,IACnI;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;AIrHO,SAAS,sBAAsBC,MAAsBC,cAA0BC,aAA8B;AAClH,EAAAF,KAAI,IAAI,wBAAwBE,YAAW,CAAC,KAAK,QAAQ;AACvD,QAAI,KAAK,EAAE,IAAI,MAAM,GAAG,iBAAiBD,aAAY,GAAG,CAAC,EAAE,CAAC;AAAA,EAC9D,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,0BAA0BE,YAAW,CAAC,KAAK,QAAQ;AACzD,QAAI,KAAK,EAAE,IAAI,MAAM,GAAG,mBAAmBD,aAAY,GAAG,CAAC,EAAE,CAAC;AAAA,EAChE,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,iDAAiDE,YAAW,CAAC,KAAK,QAAQ;AACjF,QAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,SAAS,qBAAqBD,aAAY,GAAG,GAAG;AAAA,QAC9C,aAAa,IAAI,OAAO;AAAA,QACxB,cAAc,IAAI,KAAK,iBAAiB;AAAA,QACxC,SAAS,IAAI,KAAK,YAAY;AAAA,QAC9B,UAAU,IAAI,OAAO;AAAA,QACrB,YAAY,IAAI,KAAK,cAAc,OAAO,IAAI,KAAK,eAAe,WAAW,IAAI,KAAK,aAAwC;AAAA,MAChI,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,wCAAwCE,YAAW,CAAC,KAAK,QAAQ;AACxE,QAAI,KAAK,wBAAwBD,aAAY,GAAG,GAAG;AAAA,MACjD,iBAAiB,OAAO,IAAI,KAAK,mBAAmB,IAAI,KAAK,mBAAmB,IAAI,KAAK,qBAAqB,EAAE;AAAA,MAChH,SAAS,IAAI,KAAK,YAAY;AAAA,MAC9B,QAAQ,OAAO,IAAI,KAAK,WAAW,WAAW,IAAI,KAAK,SAAS;AAAA,MAChE,QAAQ,IAAI,KAAK,WAAW,aAAa,aAAa;AAAA,IACxD,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACJ;;;ACvCA,SAAS,cAA4B;;;ACArC,SAAS,cAAAE,aAAY,eAAAC,cAAa,gBAAAC,qBAAoB;AACtD,SAAS,YAAAC,WAAU,QAAAC,OAAM,YAAAC,iBAAgB;AA4BzC,SAAS,KAAK,KAAuB;AACnC,SAAOC,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC,EAAE,QAAQ,WAAS;AAChE,UAAM,OAAOC,MAAK,KAAK,MAAM,IAAI;AACjC,QAAI,MAAM,YAAY,EAAG,QAAO,KAAK,IAAI;AACzC,WAAO,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,EAClE,CAAC;AACH;AAEA,SAAS,SAAS,MAAsC;AACtD,SAAO,OAAO;AAAA,IACZ,CAAC,GAAG,KAAK,SAAS,uBAAuB,CAAC,EAAE,IAAI,WAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,EAC3G;AACF;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,KAAK,EAAE,YAAY;AACzC,MAAI,YAAY,WAAY,QAAO;AACnC,MAAI,YAAY,SAAU,QAAO;AACjC,MAAI,YAAY,UAAW,QAAO;AAClC,MAAI,YAAY,OAAQ,QAAO;AAC/B,MAAI,YAAY,eAAe,YAAY,aAAa,YAAY,IAAK,QAAO;AAChF,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkC;AACzD,QAAM,QAAQ,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,GAAG;AAC3D,MAAI,UAAU,YAAY,UAAU,eAAe,UAAU,YAAY,UAAU,aAAa,UAAU,WAAY,QAAO;AAC7H,SAAO;AACT;AAEA,SAAS,UAAU,MAA4B,MAAsB;AACnE,QAAMC,QAAOC,UAAS,MAAM,KAAK,EAAE,QAAQ,iBAAiB,EAAE;AAC9D,SAAO,GAAG,IAAI,IAAID,KAAI;AACxB;AAEA,SAAS,aAAa,MAAmC;AACvD,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,OAAO,MAAM,SAAS,QAAQ,IAAI,UAAU,MAAM,SAAS,UAAU,IAAI,YAAY;AAC3F,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAOE,cAAa,MAAM,MAAM;AACtC,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,cAAc,MAAM,MAAM,QAAQ,UAAU,IAAI,CAAC,KAAK;AAC5D,QAAM,eAAe,KAAK,eAAe,KAAK,KAAK,eAAe,MAAM,aAAa,KAAK,eAAe,IAAI;AAC7G,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,KAAK;AAAA,IACf,SAAS,iBAAiB,KAAK,WAAW,WAAW;AAAA,IACrD,KAAK,KAAK;AAAA,IACV;AAAA,IACA,OAAO,gBAAgB,KAAK,MAAM;AAAA,IAClC,QAAQ,UAAU,MAAM,IAAI;AAAA,IAC5B;AAAA,IACA,YAAYC,UAAS,UAAU,IAAI;AAAA,IACnC,OAAO,KAAK,MAAM,aAAa,IAAI,CAAC,KAAKF,UAAS,MAAM,KAAK;AAAA,EAC/D;AACF;AAEA,SAAS,kBAAkB,MAAkC;AAC3D,QAAM,OAAO,QAAQ,IAAI,+BAA+BF,MAAK,UAAU,gBAAgB,UAAU;AACjG,MAAI,CAACK,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,SAAO,KAAK,IAAI,EACb,IAAI,YAAY,EAChB,OAAO,CAAC,SAA+B,QAAQ,IAAI,CAAC,EACpD,OAAO,UAAQ,SAAS,SAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,EACzD,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AAC5D;AAEO,SAAS,uBAAuB,SAAiB,SAA+B;AACrF,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,QAAQ,kBAAkB,IAAI;AACpC,QAAM,QAAQ;AAAA,IACZ,SAAS,QAAQ;AAAA,IACjB,UAAU,QAAQ,YAAY;AAAA,IAC9B,cAAc,QAAQ;AAAA,IACtB,OAAO,YAAY,IAAI;AAAA,IACvB,OAAO,QAAQ,SAAS;AAAA,EAC1B;AACA,MAAI,CAAC,QAAQ,cAAc;AACzB,WAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,OAAO,QAAQ,UAAU,KAAK,GAAG,OAAO,aAAa,KAAK,EAAE;AAAA,EAC/F;AACA,qBAAmB,SAAS,KAAK;AACjC,MAAI,WAAW;AACf,aAAW,QAAQ,OAAO;AACxB,sBAAkB,SAAS;AAAA,MACzB,SAAS,QAAQ;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,YAAY,MAAM;AAAA,MACjC,SAAS,KAAK;AAAA,MACd,cAAc;AAAA,MACd,KAAK,KAAK;AAAA,MACV,OAAO,YAAY,KAAK,IAAI,SAAS,KAAK,UAAU;AAAA,MACpD,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,IACd,CAAC;AACD,QAAI,KAAK,cAAc;AACrB,6BAAuB,SAAS,EAAE,SAAS,KAAK,cAAc,cAAc,MAAM,QAAQ,KAAK,QAAQ,MAAM,UAAU,CAAC;AACxH,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,UAAU,QAAQ,SAAS,QAAQ,EAAE,GAAG,UAAU,KAAK,GAAG,SAAS,GAAG,OAAO,aAAa,KAAK,EAAE;AACtH;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO;AAAA,IACL,UAAU,MAAM,OAAO,UAAQ,KAAK,SAAS,SAAS,EAAE;AAAA,IACxD,QAAQ,MAAM,OAAO,UAAQ,KAAK,SAAS,OAAO,EAAE;AAAA,IACpD,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,IAAI,WAAS;AAAA,IACxB,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,eAAe,KAAK;AAAA,IACpB,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK;AAAA,EACd,EAAE;AACJ;;;AChJA,IAAM,QAAQ;AAAA,EACZ,CAAC,eAAe,aAAa;AAAA,EAC7B,CAAC,eAAe,cAAc;AAAA,EAC9B,CAAC,eAAe,aAAa;AAAA,EAC7B,CAAC,aAAa,WAAW;AAAA,EACzB,CAAC,aAAa,WAAW;AAAA,EACzB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,uBAAuB,qBAAqB;AAC/C;AAGA,IAAM,sBAA+C,CAAC,eAAe,eAAe,aAAa,WAAW;AAE5G,SAAS,eAA4C;AACnD,SAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,YAAY,EAAE;AACpD;AAEA,SAAS,WAAW,MAAmC,OAAiE;AACtH,SAAO;AAAA,IACL,OAAO,KAAK,QAAQ,MAAM;AAAA,IAC1B,IAAI,KAAK,KAAK,MAAM;AAAA,IACpB,OAAO,KAAK,QAAQ,MAAM;AAAA,IAC1B,YAAY,KAAK,aAAa,MAAM;AAAA,EACtC;AACF;AAEA,SAAS,oBAAoB,SAA4C;AACvE,QAAM,UAAU,oBAAI,IAA0B;AAC9C,QAAM,WAAW;AACjB,MAAI,OAAO;AACX,SAAO,MAAM;AACX,UAAM,WAAW,WAAW,SAAS,EAAE,MAAM,UAAU,QAAQ,MAAM,CAAC;AACtE,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,UAAU,QAAQ,IAAI,MAAM,QAAQ,KAAK,EAAE,OAAO,OAAO,IAAI,MAAM;AACzE,cAAQ,IAAI,MAAM,UAAU;AAAA,QAC1B,OAAO,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAAA,QAC3C,IAAI,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,MACpC,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,SAAS,WAAW,WAAY;AAC5C,YAAQ;AAAA,EACV;AACA,QAAMC,iBAAgB,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO;AAClG,QAAM,YAAY,kBAAkB,SAASA,cAAa;AAC1D,aAAW,WAAWA,gBAAe;AACnC,UAAM,SAAS,QAAQ,IAAI,OAAO;AAClC,QAAI,OAAQ,QAAO,eAAe,UAAU,OAAO,GAAG,gBAAgB;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAmB,SAAiE;AAC1G,SAAO,KAAK,OAAO,OAAO,CAAC,SAAS,UAAU;AAC5C,UAAM,SAAS,QAAQ,IAAI,MAAM,QAAQ;AACzC,WAAO;AAAA,MACL,OAAO,QAAQ,SAAS,QAAQ,QAAQ,IAAI;AAAA,MAC5C,IAAI,QAAQ,MAAM,QAAQ,KAAK,IAAI;AAAA,MACnC,OAAO,QAAQ,QAAQ;AAAA,MACvB,YAAY,QAAQ,cAAc,CAAC,QAAQ,SAAS,CAAC,QAAQ,KAAK,IAAI;AAAA,IACxE;AAAA,EACF,GAAG,aAAa,CAAC;AACnB;AAEA,SAAS,iBAAiB,SAAiB,MAAmB,SAA0E;AACtI,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,iBAAiB;AACrB,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,SAAS,QAAQ,IAAI,MAAM,QAAQ;AACzC,QAAI,QAAQ,SAAS,OAAO,GAAI,eAAc;AAAA,aACrC,QAAQ,OAAO;AACtB,mBAAa;AACb,yBAAmB,MAAM;AACzB,UAAI,OAAO,iBAAiB,WAAY,kBAAiB;AAAA,UACpD,gBAAe;AAAA,IACtB,WAAW,QAAQ,GAAI,aAAY;AAAA,QAC9B,eAAc;AAAA,EACrB;AACA,MAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,QAAM,QAAQ,YAAY,IACtB,GAAG,SAAS,cAAc,cAAc,IAAI,SAAM,WAAW,+BAA+B,2BAAwB,KACpH,aAAa,IAAI,GAAG,UAAU,uBAC5B,WAAW,IAAI,GAAG,QAAQ,eACxB,GAAG,UAAU;AACrB,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,IACA,cAAc;AAAA,IACd,sBAAsB,iBAAiB,sCAAsC,OAAO,eAAe,cAAc,sBAAsB;AAAA,IACvI,YAAY;AAAA,IACZ,qBAAqB,iBAAiB,qCAAqC,OAAO,YAAY;AAAA,IAC9F,sBAAsB,iBAAiB,sCAAsC,OAAO,eAAe,cAAc,uCAAuC;AAAA,IACxJ,cAAc;AAAA,IACd,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,SAAiB,MAAmB,cAAkC,SAAyD;AAC9I,QAAM,YAAY,KAAK,aAAa,iBAAiB,IAAI;AACzD,SAAO;AAAA,IACL,eAAe,eAAe,MAAM,OAAO;AAAA,IAC3C,sBAAsB,KAAK,OAAO;AAAA,IAClC,YAAY,iBAAiB,SAAS,MAAM,OAAO;AAAA,IACnD,SAAS,KAAK;AAAA,IACd,WAAW,KAAK,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASC,SAAQ,IAA2B,OAAmD;AAC7F,QAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,MAAM,WAAW,EAAE,IAAI,CAAC,KAAK;AAC9D,SAAO,EAAE,IAAI,OAAO,OAAO,OAAO,MAAM,OAAO;AACjD;AAEA,SAAS,YAAY,MAAuD;AAC1E,SAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM;AAC7D;AA8BA,SAAS,cAAc,YAAmC,WAAqG;AAC7J,aAAW,UAAU,WAAW;AAC9B,UAAM,OAAO,WAAW,KAAK,eAAa,UAAU,OAAO,MAAM;AACjE,UAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,QAAI,QAAQ,KAAM,QAAO,EAAE,MAAM,KAAK;AAAA,EACxC;AACA,SAAO;AACT;AAUO,SAAS,mBAAmB,SAA0C;AAC3E,QAAM,QAAQ,iBAAiB,OAAO,EAAE;AACxC,QAAM,SAAS,iBAAiB,OAAO;AACvC,QAAM,eAAe,OAAO,QAAQ,KAAK;AACzC,QAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAM,QAAQ,MAAM,IAAI,UAAQ,QAAQ,SAAS,MAAM,cAAc,OAAO,CAAC;AAC7E,QAAM,aAAa,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM;AACrC,UAAM,YAAY,OAAO,gBACrB,MAAM,OAAO,UAAQ,KAAK,SAAS,IACnC,MAAM,OAAO,UAAQ,KAAK,cAAc,EAAE;AAC9C,WAAOC,SAAQ,IAAI,SAAS;AAAA,EAC9B,CAAC;AACD,QAAM,aAAa,cAAc,YAAY,mBAAmB;AAChE,QAAM,UAAU,MAAM,OAAO,CAAC,OAAO,SAAS,WAAW,OAAO,KAAK,aAAa,GAAG,aAAa,CAAC;AACnG,QAAM,aAAa,OAAO,YAAY,WAAW,IAAI,UAAQ,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;AACnF,QAAM,gBAAgB;AACtB,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,SAAS;AAAA,MACP,qBAAqB,GAAG,aAAa,4BAA4B,OAAO;AAAA,MACxE,sBAAsB,GAAG,aAAa,6BAA6B,OAAO;AAAA,MAC1E,kBAAkB,GAAG,aAAa,wBAAwB,OAAO;AAAA,IACnE;AAAA,IACA,OAAO;AAAA,IACP,aAAa,YAAY,QAAQ;AAAA,IACjC,kBAAkB,aAAa,YAAY,WAAW,IAAI,IAAI;AAAA,IAC9D;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,QAAQ;AAAA,MACN,iBAAiB,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,sBAAsB,CAAC;AAAA,MAC/E,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,MACb,iBAAiB,OAAO,WAAW,IAAI;AAAA,MACvC;AAAA,IACF;AAAA,IACA,SAAS,OAAO;AAAA,EAClB;AACF;;;AFnMA,SAASC,YAAW,KAAc,KAAiC;AACjE,QAAM,QAAS,IAAI,KAAiC,GAAG;AACvD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASC,UAAS,KAAc,KAAsB;AACpD,SAAQ,IAAI,KAAiC,GAAG,MAAM;AACxD;AAEA,SAASC,uBAAsB,KAAkC;AAC/D,QAAM,SAAS,IAAI,OAAO,uBAAuB;AACjD,MAAI,OAAQ,QAAO;AACnB,QAAM,QAAS,IAAI,KAAiC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,iBAAiB,KAAmF;AAC3G,SAAO,EAAE,MAAM,IAAI,MAAiC,OAAO,IAAI,MAAM;AACvE;AAEO,SAAS,mBAAmBC,cAAsC;AACvE,QAAM,SAAS,OAAO;AAEtB,SAAO,IAAI,YAAY,CAAC,KAAK,QAAQ;AACnC,QAAI,KAAK,mBAAmBA,aAAY,GAAG,CAAC,CAAC;AAAA,EAC/C,CAAC;AAED,SAAO,KAAK,YAAY,CAAC,KAAK,QAAQ;AACpC,QAAI,KAAK,mBAAmBA,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAC9D,SAASH,YAAW,KAAK,SAAS,KAAKA,YAAW,KAAK,IAAI,KAAK;AAAA,MAChE,UAAUA,YAAW,KAAK,UAAU;AAAA,MACpC,SAASA,YAAW,KAAK,SAAS;AAAA,MAClC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,OAAOD,YAAW,KAAK,OAAO;AAAA,MAC9B,OAAOA,YAAW,KAAK,OAAO,KAAK;AAAA,IACrC,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,gBAAgB,CAAC,KAAK,QAAQ;AACxC,UAAM,OAAOA,YAAW,KAAK,MAAM;AACnC,QAAI,KAAK,uBAAuBG,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAClE,SAASH,YAAW,KAAK,SAAS,KAAK;AAAA,MACvC,UAAUA,YAAW,KAAK,UAAU;AAAA,MACpC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,MAAM,SAAS,cAAc,SAAS,YAAY,SAAS,QAAQ,OAAO;AAAA,MAC1E,OAAOD,YAAW,KAAK,OAAO;AAAA,IAChC,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,IAAI,WAAW,CAAC,KAAK,QAAQ;AAClC,QAAI,KAAK,iBAAiBG,aAAY,GAAG,CAAC,CAAC;AAAA,EAC7C,CAAC;AAED,SAAO,IAAI,UAAU,CAAC,KAAK,QAAQ;AACjC,QAAI,KAAK,mBAAmBA,aAAY,GAAG,CAAC,CAAC;AAAA,EAC/C,CAAC;AAED,SAAO,KAAK,WAAW,CAAC,KAAK,QAAQ;AACnC,QAAI,KAAK,iBAAiBA,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAC5D,YAAYD,uBAAsB,GAAG;AAAA,MACrC,cAAcD,UAAS,KAAK,cAAc;AAAA,MAC1C,OAAOD,YAAW,KAAK,OAAO;AAAA,MAC9B,QAAQA,YAAW,KAAK,QAAQ,KAAK;AAAA,IACvC,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,iBAAiB,CAAC,KAAK,QAAQ;AACzC,QAAI,KAAK,mBAAmBG,aAAY,iBAAiB,GAAG,CAAC,GAAGF,UAAS,KAAK,cAAc,GAAGC,uBAAsB,GAAG,CAAC,CAAC;AAAA,EAC5H,CAAC;AAED,SAAO,IAAI,qBAAqB,CAAC,KAAK,QAAQ;AAC5C,QAAI,KAAK,gBAAgBC,aAAY,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AAAA,EAChE,CAAC;AAED,SAAO,IAAI,UAAU,CAAC,KAAK,QAAQ;AACjC,QAAI,KAAK,iBAAiBA,aAAY,GAAG,GAAG;AAAA,MAC1C,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU;AAAA,MACrE,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU;AAAA,MACrE,OAAO,OAAO,IAAI,MAAM,UAAU,WAAW,IAAI,MAAM,QAAQ;AAAA,IACjE,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,UAAU,CAAC,KAAK,QAAQ;AAClC,QAAI,KAAK,kBAAkBA,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAC7D,SAASH,YAAW,KAAK,SAAS,KAAK;AAAA,MACvC,MAAMA,YAAW,KAAK,MAAM;AAAA,MAC5B,UAAUA,YAAW,KAAK,UAAU;AAAA,MACpC,SAASA,YAAW,KAAK,SAAS,KAAK;AAAA,MACvC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,KAAKD,YAAW,KAAK,KAAK;AAAA,MAC1B,OAAOA,YAAW,KAAK,OAAO;AAAA,MAC9B,OAAOA,YAAW,KAAK,OAAO;AAAA,MAC9B,QAAQA,YAAW,KAAK,QAAQ,KAAKA,YAAW,KAAK,IAAI,KAAK;AAAA,MAC9D,YAAYA,YAAW,KAAK,YAAY;AAAA,MACxC,OAAOA,YAAW,KAAK,OAAO,KAAK;AAAA,IACrC,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,kBAAkB,CAAC,KAAK,QAAQ;AAC1C,QAAI,KAAK,kBAAkBG,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAC7D,SAASH,YAAW,KAAK,SAAS;AAAA,MAClC,MAAMA,YAAW,KAAK,MAAM;AAAA,MAC5B,UAAUA,YAAW,KAAK,UAAU;AAAA,MACpC,SAASA,YAAW,KAAK,SAAS;AAAA,MAClC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,YAAYC,uBAAsB,GAAG;AAAA,MACrC,KAAKF,YAAW,KAAK,KAAK;AAAA,MAC1B,OAAOA,YAAW,KAAK,OAAO;AAAA,MAC9B,OAAOA,YAAW,KAAK,OAAO;AAAA,MAC9B,UAAUA,YAAW,KAAK,UAAU;AAAA,MACpC,QAAQ,IAAI,OAAO;AAAA,MACnB,aAAaA,YAAW,KAAK,aAAa;AAAA,MAC1C,YAAYA,YAAW,KAAK,YAAY;AAAA,MACxC,OAAOA,YAAW,KAAK,OAAO;AAAA,MAC9B,KAAKA,YAAW,KAAK,KAAK;AAAA,IAC5B,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,yBAAyB,CAAC,KAAK,QAAQ;AACjD,QAAI,KAAK,uBAAuBG,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAClE,SAASH,YAAW,KAAK,SAAS,KAAK;AAAA,MACvC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,YAAYC,uBAAsB,GAAG;AAAA,MACrC,OAAOF,YAAW,KAAK,OAAO;AAAA,MAC9B,QAAQ,IAAI,OAAO;AAAA,MACnB,MAAMA,YAAW,KAAK,MAAM;AAAA,IAC9B,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO,KAAK,gCAAgC,CAAC,KAAK,QAAQ;AACxD,QAAI,KAAK,uBAAuBG,aAAY,iBAAiB,GAAG,CAAC,GAAG;AAAA,MAClE,SAASH,YAAW,KAAK,SAAS,KAAK;AAAA,MACvC,cAAcC,UAAS,KAAK,cAAc;AAAA,MAC1C,YAAYC,uBAAsB,GAAG;AAAA,MACrC,QAAQ,IAAI,OAAO;AAAA,MACnB,MAAMF,YAAW,KAAK,MAAM;AAAA,IAC9B,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,SAAO;AACT;;;AGnIA,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACzC,YAAY,SAAwB,SAAS,KAAK;AAChD,UAAM,OAAO;AADqB;AAAA,EAEpC;AAAA,EAFoC;AAGtC;AAEO,SAAS,yBAAyB,OAAiD;AACxF,SAAO,iBAAiB;AAC1B;AAUA,SAAS,UAAa,OAAkC,UAAgB;AACtE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,KAAK,MAAM,KAAK;AACzB;AAuGA,SAAS,YAAY,KAAoD;AACvE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,cAAc,IAAI;AAAA,IAClB,QAAQ,IAAI;AAAA,IACZ,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,SAAS,UAAU,OAAO,IAAI,YAAY,GAAG,IAAI;AAAA,IACjD,YAAY,OAAO,IAAI,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,WAAW,KAAmD;AACrE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,cAAc,OAAO,IAAI,YAAY;AAAA,IACrC,WAAW,OAAO,IAAI,SAAS;AAAA,IAC/B,iBAAiB,OAAO,IAAI,eAAe;AAAA,IAC3C,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,cAAc,OAAO,IAAI,YAAY;AAAA,IACrC,mBAAmB,OAAO,IAAI,iBAAiB;AAAA,IAC/C,iBAAiB,OAAO,IAAI,eAAe;AAAA,IAC3C,aAAa,OAAO,IAAI,WAAW;AAAA,EACrC;AACF;AAEO,SAAS,kBAAkB,UAAwB,SAAiB,IAA2B;AACpG,QAAM,MAAM,SAAS,QAAQ,+DAA+D,EAAE,IAAI,SAAS,EAAE;AAC7G,MAAI,CAAC,IAAK,OAAM,IAAI,uBAAuB,2BAA2B,EAAE,IAAI,GAAG;AAC/E,QAAM,YAAY,SAAS,QAAQ,wEAAwE,EAAE,IAAI,EAAE;AACnH,QAAM,SAAS,UAAU,IAAI,YAAU;AAAA,IACrC,IAAI,OAAO,MAAM,EAAE;AAAA,IACnB,QAAQ,OAAO,MAAM,MAAM;AAAA,IAC3B,YAAY,OAAO,MAAM,UAAU;AAAA,IACnC,UAAU,OAAO,MAAM,QAAQ;AAAA,IAC/B,eAAe,OAAO,MAAM,aAAa;AAAA,IACzC,MAAM,MAAM;AAAA,IACZ,UAAU,OAAO,MAAM,QAAQ;AAAA,IAC/B,oBAAoB,OAAO,MAAM,kBAAkB;AAAA,IACnD,oBAAoB,UAA+B,OAAO,MAAM,uBAAuB,GAAG,CAAC,CAAwB;AAAA,EACrH,EAAE;AACF,QAAM,UAAW,SAAS,QAAQ,6EAA6E,EAAE,IAAI,EAAE,EAAqC,IAAI,UAAU;AAC1K,QAAM,WAAY,SAAS,QAAQ,gFAAgF,EAAE,IAAI,EAAE,EAAqC,IAAI,WAAW;AAC/K,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,UAAU,IAAI;AAAA,IACd,iBAAiB,OAAO,IAAI,eAAe;AAAA,IAC3C,aAAa,OAAO,IAAI,WAAW;AAAA,IACnC,eAAe,OAAO,IAAI,aAAa;AAAA,IACvC,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,uBAAuB,OAAO,IAAI,qBAAqB;AAAA,IACvD,QAAQ,IAAI;AAAA,IACZ,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,SAAS,UAAmC,OAAO,IAAI,YAAY,GAAG,CAAC,CAA4B;AAAA,IACnG,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,YAAY,OAAO,IAAI,UAAU;AAAA,IACjC,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IACrE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AClNO,SAAS,wBACd,UAAU,gBACV,SAAqE,CAAC,GAC3C;AAC3B,QAAM,UAAU,CAAC,oBAAoB;AACrC,QAAM,SAAmB,CAAC,OAAO;AACjC,MAAI,OAAO,aAAa;AACtB,YAAQ,KAAK,uBAAuB;AACpC,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC;AACA,MAAI,OAAO,SAAS;AAClB,YAAQ,KAAK,oFAAoF;AACjG,WAAO,KAAK,OAAO,SAAS,OAAO,SAAS,OAAO,OAAO;AAAA,EAC5D;AACA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,UAAU,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;AAClG,QAAM,WAAW,UAAU;AAC3B,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,cAKpB,QAAQ,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,KAG9B,EAAE,IAAI,GAAG,QAAQ,KAAK;AACvB,WAAO,EAAE,IAAI,MAAM,SAAS,uBAAuB,SAAS,MAAM,KAAK,IAAI,SAAO,kBAAkB,UAAU,SAAS,IAAI,EAAE,CAAC,GAAG,WAAW,OAAO,EAAE;AAAA,EACvJ,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;;;ACpBA,SAASI,YAAW,KAAsB,KAAiC;AACzE,QAAM,QAAS,IAAI,KAAiC,GAAG;AACvD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASC,UAAS,KAAsB,KAAsB;AAC5D,SAAQ,IAAI,KAAiC,GAAG,MAAM;AACxD;AAEO,SAAS,0BAA0BC,MAAsBC,cAA0BC,aAA8B;AACtH,EAAAF,KAAI,IAAI,mCAAmCE,YAAW,CAAC,KAAK,QAAQ;AAClE,QAAI,KAAK,iBAAiBD,aAAY,GAAG,GAAG,IAAI,OAAO,WAAW,CAAC;AAAA,EACrE,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,8BAA8BE,YAAW,CAAC,KAAK,QAAQ;AAC7D,QAAI,KAAK,eAAeD,aAAY,GAAG,GAAG,IAAI,OAAO,MAAM,CAAC;AAAA,EAC9D,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,2CAA2CE,YAAW,CAAC,KAAK,QAAQ;AAC3E,QAAI,KAAK,8BAA8BD,aAAY,GAAG,GAAG;AAAA,MACvD,cAAcH,YAAW,KAAK,cAAc,KAAK;AAAA,MACjD,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAE,KAAI,KAAK,sCAAsCE,YAAW,CAAC,KAAK,QAAQ;AACtE,QAAI,KAAK,sBAAsBD,aAAY,GAAG,GAAG;AAAA,MAC/C,OAAOH,YAAW,KAAK,OAAO,KAAK;AAAA,MACnC,SAASA,YAAW,KAAK,SAAS,KAAKA,YAAW,KAAK,SAAS,KAAK;AAAA,MACrE,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAE,KAAI,KAAK,oCAAoCE,YAAW,CAAC,KAAK,QAAQ;AACpE,QAAI,KAAK,iBAAiBD,aAAY,GAAG,GAAG;AAAA,MAC1C,WAAWH,YAAW,KAAK,WAAW,KAAKA,YAAW,KAAK,YAAY,KAAK;AAAA,MAC5E,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAE,KAAI,KAAK,oCAAoCE,YAAW,CAAC,KAAK,QAAQ;AACpE,QAAI,KAAK,iBAAiBD,aAAY,GAAG,GAAG;AAAA,MAC1C,YAAYH,YAAW,KAAK,YAAY,KAAKA,YAAW,KAAK,aAAa,KAAK;AAAA,MAC/E,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAE,KAAI,KAAK,qCAAqCE,YAAW,CAAC,KAAK,QAAQ;AACrE,QAAI,KAAK,kBAAkBD,aAAY,GAAG,GAAG;AAAA,MAC3C,OAAOH,YAAW,KAAK,OAAO,KAAK;AAAA,MACnC,cAAcC,UAAS,KAAK,cAAc,KAAKA,UAAS,KAAK,eAAe;AAAA,MAC5E,UAAUA,UAAS,KAAK,UAAU;AAAA,MAClC,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAC,KAAI,KAAK,uCAAuCE,YAAW,CAAC,KAAK,QAAQ;AACvE,QAAI,KAAK,oBAAoBD,aAAY,GAAG,GAAG;AAAA,MAC7C,OAAOH,YAAW,KAAK,OAAO,KAAK;AAAA,MACnC,cAAcA,YAAW,KAAK,cAAc;AAAA,MAC5C,QAAQA,YAAW,KAAK,QAAQ,KAAK;AAAA,MACrC,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AACJ;;;AC/EA,SAAS,cAAAK,mBAAkB;AAC3B,SAAS,gBAAAC,eAAc,cAAAC,aAAY,aAAAC,YAAW,aAAa,gBAAAC,eAAc,QAAQ,iBAAAC,sBAAqB;AACtG,SAAS,cAAc;AACvB,SAAS,WAAAC,UAAS,QAAAC,OAAM,aAAa;AACrC,SAAS,kBAAkB;AAO3B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,eAAe,CAAC,gBAAgB,sBAAsB;AAC5D,IAAM,yBAAyBC,MAAK,UAAU,YAAY,gBAAgB,WAAW,2BAA2B;AA8ChH,IAAM,aAAa;AAAA,EACjB,EAAE,KAAK,QAAQ,SAAS,YAAY,MAAM,iBAAiB,OAAO,wBAAwB,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC7H,EAAE,KAAK,SAAS,SAAS,UAAU,MAAM,uBAAuB,OAAO,cAAc,MAAM,WAAW,QAAQ,UAAU;AAAA,EACxH,EAAE,KAAK,SAAS,SAAS,YAAY,MAAM,yBAAyB,OAAO,gBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC9H,EAAE,KAAK,SAAS,SAAS,YAAY,MAAM,6BAA6B,OAAO,oBAAoB,MAAM,WAAW,QAAQ,UAAU;AAAA,EACtI,EAAE,KAAK,UAAU,SAAS,UAAU,MAAM,uBAAuB,OAAO,cAAc,MAAM,WAAW,QAAQ,UAAU;AAAA,EACzH,EAAE,KAAK,UAAU,SAAS,UAAU,MAAM,6BAA6B,OAAO,sBAAsB,MAAM,WAAW,QAAQ,UAAU;AAAA,EACvI,EAAE,KAAK,UAAU,SAAS,YAAY,MAAM,yBAAyB,OAAO,gBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC/H,EAAE,KAAK,UAAU,SAAS,YAAY,MAAM,wBAAwB,OAAO,eAAe,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC7H,EAAE,KAAK,UAAU,SAAS,YAAY,MAAM,wBAAwB,OAAO,wBAAwB,MAAM,WAAW,QAAQ,UAAU;AAAA,EACtI,EAAE,KAAK,OAAO,SAAS,UAAU,MAAM,uBAAuB,OAAO,cAAc,MAAM,WAAW,QAAQ,UAAU;AACxH;AAEA,IAAM,YAAY;AAAA,EAChB,CAAC,QAAQ,OAAO;AAAA,EAChB,CAAC,QAAQ,OAAO;AAAA,EAChB,CAAC,QAAQ,OAAO;AAAA,EAChB,CAAC,SAAS,QAAQ;AAAA,EAClB,CAAC,SAAS,QAAQ;AAAA,EAClB,CAAC,SAAS,QAAQ;AAAA,EAClB,CAAC,SAAS,QAAQ;AAAA,EAClB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,UAAU,KAAK;AAClB;AAEA,IAAM,gBAAgB,oBAAI,IAAsC;AAAA,EAC9D,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EACzB,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;AAAA,EAC1B,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC5B,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC5B,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7B,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC;AAAA,EAC5B,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7B,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7B,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,EAC9B,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,GAAG,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,SAAyB;AAC/C,SAAOA,MAAK,UAAU,kBAAkB,GAAG,cAAc,OAAO;AAClE;AAEA,SAAS,iBAAiB,SAAiB,OAA0C;AACnF,SAAOA,MAAK,GAAG,cAAc,SAAS,MAAM,SAAS,MAAM,IAAI;AACjE;AAEA,SAAS,aAAa,SAAiB,OAA0C;AAC/E,SAAOA,MAAK,eAAe,OAAO,GAAG,MAAM,SAAS,MAAM,IAAI;AAChE;AAEA,SAAS,qBAAyC;AAChD,SAAO,KAAK,MAAMC,cAAa,wBAAwB,MAAM,CAAC;AAChE;AAEA,SAAS,uBAAuB,UAA8B,OAAwC;AACpG,SAAOD,MAAK,SAAS,MAAM,YAAY,MAAM,IAAI;AACnD;AAEA,SAAS,mBAAmB,UAA8B,OAAwC;AAChG,SAAOA,MAAK,UAAU,kBAAkB,uBAAuB,UAAU,KAAK,CAAC;AACjF;AAEA,SAAS,6BAA6B,UAA8B,SAAkD;AACpH,SAAOA,MAAK,SAAS,MAAM,YAAY,mBAAmB,QAAQ,IAAI;AACxE;AAEA,SAAS,yBAAyB,UAA8B,SAAkD;AAChH,SAAOA,MAAK,UAAU,kBAAkB,6BAA6B,UAAU,OAAO,CAAC;AACzF;AAEA,SAAS,4BAA4B,SAAkD;AACrF,SAAOA,MAAKE,SAAQ,sBAAsB,GAAG,sBAAsB,QAAQ,IAAI;AACjF;AAEA,SAAS,qBAAqB,UAA8B,OAAgC,WAAkC;AAC5H,QAAM,SAASF,MAAK,WAAW,MAAM,IAAI;AACzC,MAAIG,YAAW,MAAM,EAAG,QAAO;AAC/B,QAAM,SAASH,MAAK,WAAW,SAAS,MAAM,YAAY,MAAM,IAAI;AACpE,SAAOG,YAAW,MAAM,IAAI,SAAS;AACvC;AAEA,SAAS,qBAAqB,UAA8B;AAC1D,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,SAAS,QAAQ;AACnC,UAAM,eAAe,uBAAuB,UAAU,KAAK;AAC3D,UAAM,OAAO,mBAAmB,UAAU,KAAK;AAC/C,QAAI,CAACA,YAAW,IAAI,GAAG;AACrB,cAAQ,KAAK,YAAY;AACzB;AAAA,IACF;AACA,QAAI,WAAW,IAAI,MAAM,MAAM,gBAAiB,SAAQ,KAAK,YAAY;AAAA,EAC3E;AACA,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAEA,SAAS,UAAU,OAAgC;AACjD,SAAOC,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAEA,SAAS,iBAAiB,SAAyB;AACjD,QAAM,WAAW,QAAQ,QAAQ,SAAS,EAAE,EAAE,QAAQ,SAAS,EAAE;AACjE,MAAI,CAAC,YAAY,aAAa,IAAK,QAAO;AAC1C,MAAI,SAAS,SAAS,IAAI,KAAK,SAAS,WAAW,GAAG,KAAK,aAAa,KAAK,QAAQ,GAAG;AACtF,UAAM,IAAI,MAAM,yCAAyC,OAAO,EAAE;AAAA,EACpE;AACA,QAAM,aAAa,MAAM,UAAU,QAAQ;AAC3C,MAAI,CAAC,cAAc,eAAe,OAAO,WAAW,WAAW,KAAK,KAAK,eAAe,MAAM;AAC5F,UAAM,IAAI,MAAM,yCAAyC,OAAO,EAAE;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAAgB,OAAe,QAAwB;AACvE,QAAM,MAAM,OAAO,SAAS,QAAQ,OAAO,QAAQ,MAAM,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACrF,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,CAAC,WAAW,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,0CAA0C,GAAG,EAAE;AAC1F,SAAO,OAAO,SAAS,KAAK,CAAC;AAC/B;AAEA,SAAS,QAAQ,QAAwB;AACvC,QAAM,OAAO,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,QAAQ,SAAS,EAAE;AAChE,QAAM,SAAS,OAAO,SAAS,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,EAAE;AACpE,SAAO,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AACxC;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,SAAS,SAAS,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS,KAAK;AACvE;AAEA,SAAS,8BAA8B,SAAiB,UAA8B,aAAqB;AACzG,QAAM,WAAW,IAAI,IAAI,SAAS,OAAO,IAAI,WAAS,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAC1E,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,OAAO,WAAW,OAAO;AAC/B,MAAI,SAAS;AACb,SAAO,SAAS,OAAO,KAAK,QAAQ;AAClC,UAAM,SAAS,KAAK,SAAS,QAAQ,SAAS,GAAG;AACjD,cAAU;AACV,QAAI,OAAO,MAAM,UAAQ,SAAS,CAAC,EAAG;AACtC,UAAM,WAAW,OAAO,SAAS,QAAQ,KAAK,GAAG;AACjD,UAAM,UAAU,QAAQ,MAAM;AAC9B,UAAM,OAAO,iBAAiB,OAAO;AACrC,UAAM,OAAO,SAAS,QAAQ,KAAK,EAAE;AACrC,UAAM,aAAa,SAAS,KAAK,KAAK,OAAO,GAAG,IAAI;AACpD,QAAI,aAAa,KAAK,OAAQ,OAAM,IAAI,MAAM,6CAA6C,OAAO,EAAE;AACpG,QAAI,CAAC,QAAQ,aAAa,KAAK;AAC7B,eAAS;AACT;AAAA,IACF;AACA,QAAI,aAAa,OAAO,aAAa,KAAK;AACxC,eAAS;AACT;AAAA,IACF;AACA,QAAI,mBAAmB,IAAI,GAAG;AAC5B,eAAS;AACT;AAAA,IACF;AACA,QAAI,YAAY,aAAa,IAAK,OAAM,IAAI,MAAM,uDAAuD,IAAI,EAAE;AAC/G,UAAM,aAAa,KAAK,WAAW,GAAG,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,SAAS,MAAM,WAAW,SAAS,CAAC,IAAI;AACzH,UAAM,QAAQ,SAAS,IAAI,UAAU;AACrC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAChF,QAAI,SAAS,MAAM,WAAY,OAAM,IAAI,MAAM,gDAAgD,IAAI,EAAE;AACrG,UAAM,OAAO,KAAK,SAAS,QAAQ,SAAS,IAAI;AAChD,UAAM,YAAY,UAAU,IAAI;AAChC,QAAI,cAAc,MAAM,gBAAiB,OAAM,IAAI,MAAM,yDAAyD,IAAI,EAAE;AACxH,UAAM,SAASJ,MAAK,aAAa,UAAU;AAC3C,IAAAK,WAAUH,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,IAAAI,eAAc,QAAQ,IAAI;AAC1B,cAAU,IAAI,UAAU;AACxB,aAAS;AAAA,EACX;AACA,QAAM,UAAU,SAAS,OAAO,IAAI,WAAS,MAAM,IAAI,EAAE,OAAO,UAAQ,CAAC,UAAU,IAAI,IAAI,CAAC;AAC5F,MAAI,QAAQ,OAAQ,OAAM,IAAI,MAAM,oCAAoC,QAAQ,MAAM,iBAAiB,QAAQ,WAAW,IAAI,KAAK,GAAG,EAAE;AACxI,SAAO,EAAE,WAAW,UAAU,KAAK;AACrC;AAEA,eAAe,eAAe,KAAa,UAAmC;AAC5E,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8CAA8C,SAAS,MAAM,EAAE;AACjG,QAAM,gBAAgB,OAAO,SAAS,QAAQ,IAAI,gBAAgB,KAAK,CAAC;AACxE,MAAI,gBAAgB,SAAU,OAAM,IAAI,MAAM,2CAA2C,aAAa,QAAQ;AAC9G,QAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AACvD,MAAI,OAAO,SAAS,SAAU,OAAM,IAAI,MAAM,2CAA2C,OAAO,MAAM,QAAQ;AAC9G,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA2B;AACnD,SAAO,WACJ,OAAO,WAAS,CAACH,YAAW,aAAa,SAAS,KAAK,CAAC,CAAC,EACzD,IAAI,WAAS,iBAAiB,SAAS,KAAK,CAAC;AAClD;AAEO,SAAS,oBAAoB,UAAU,gBAAgB;AAC5D,QAAM,UAAU,iBAAiB,OAAO;AACxC,QAAM,UAAU,WAAW,SAAS,QAAQ;AAC5C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,YAAYH,MAAK,UAAU,gBAAgB;AAAA,IAC3C;AAAA,IACA,OAAO,WAAW;AAAA,IAClB;AAAA,IACA,iBAAiB;AAAA,IACjB,eAAe,WAAW;AAAA,IAC1B,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,8BAA8B,UAAU,gBAAgB;AACtE,QAAM,WAAW,mBAAmB;AACpC,QAAM,EAAE,SAAS,QAAQ,IAAI,qBAAqB,QAAQ;AAC1D,QAAM,UAAU,SAAS,OAAO,SAAS,QAAQ,SAAS,QAAQ;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,SAAS;AAAA,IAClB;AAAA,IACA,YAAYA,MAAK,UAAU,gBAAgB;AAAA,IAC3C,cAAc,SAAS,MAAM;AAAA,IAC7B,oBAAoB,QAAQ,SAAS,MAAM,QAAQ;AAAA,IACnD,eAAe,SAAS,MAAM,UAAU;AAAA,IACxC,iBAAiB,SAAS,MAAM,UAAU;AAAA,IAC1C,cAAc,SAAS,MAAM,UAAU;AAAA,IACvC,YAAY,SAAS,MAAM;AAAA,IAC3B,aAAa,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,OAAO,SAAS,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,eAAe,SAAS,OAAO;AAAA,IAC/B,iBAAiB,CAAC,GAAG,SAAS,GAAG,OAAO;AAAA,EAC1C;AACF;AAEA,eAAsB,gCAAgC,UAAU,gBAAgB,SAAiF,EAAE,cAAc,MAAM,GAAG;AACxL,QAAM,WAAW,mBAAmB;AACpC,QAAM,WAAW,SAAS,MAAM;AAChC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,SAAS;AAAA,MAClB;AAAA,MACA,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,OAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AACA,QAAM,YAAY,OAAO,aAAa,SAAS;AAC/C,QAAM,iBAAiB,OAAO,kBAAkB,SAAS;AACzD,QAAM,WAAW,KAAK,IAAI,SAAS,aAAa,OAAO,MAAM,SAAS,aAAa,GAAG;AACtF,QAAM,UAAU,MAAM,eAAe,WAAW,QAAQ;AACxD,QAAM,gBAAgB,UAAU,OAAO;AACvC,MAAI,kBAAkB,eAAgB,OAAM,IAAI,MAAM,yDAAyD,cAAc,SAAS,aAAa,EAAE;AACrJ,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,SAAS;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,eAAe,SAAS;AAAA,MACxB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,OAAO,SAAS,OAAO;AAAA,MACvB,eAAe,SAAS,OAAO;AAAA,IACjC;AAAA,EACF;AACA,QAAM,YAAY,YAAYA,MAAK,OAAO,GAAG,2BAA2B,CAAC;AACzE,MAAI;AACF,UAAM,YAAY,8BAA8B,SAAS,UAAU,SAAS;AAC5E,UAAM,WAAW,+BAA+B,SAAS,EAAE,cAAc,MAAM,UAAU,CAAC;AAC1F,WAAO;AAAA,MACL,GAAG;AAAA,MACH,oBAAoB;AAAA,MACpB,eAAe,SAAS;AAAA,MACxB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,WAAW,UAAU;AAAA,MACrB,cAAc,8BAA8B,OAAO;AAAA,IACrD;AAAA,EACF,UAAE;AACA,WAAO,WAAW,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EACpD;AACF;AAEO,SAAS,qBAAqB,UAAU,gBAAgB,SAAoC,EAAE,cAAc,MAAM,GAAG;AAC1H,QAAM,UAAU,IAAI,IAAI,iBAAiB,OAAO,CAAC;AACjD,MAAI,OAAO,cAAc;AACvB,eAAW,SAAS,YAAY;AAC9B,UAAI,QAAQ,IAAI,iBAAiB,SAAS,KAAK,CAAC,EAAG,eAAc,SAAS,KAAK;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,CAAC,OAAO;AAAA,IAChB,YAAYA,MAAK,UAAU,gBAAgB;AAAA,IAC3C,UAAU,OAAO,eAAe,QAAQ,OAAO;AAAA,IAC/C,OAAO,WAAW;AAAA,IAClB,eAAe,OAAO,eAAe,IAAI,QAAQ;AAAA,IACjD,SAAS,MAAM,KAAK,OAAO;AAAA,EAC7B;AACF;AAEO,SAAS,+BAA+B,UAAU,gBAAgB,SAAwD,EAAE,cAAc,MAAM,GAAG;AACxJ,QAAM,WAAW,mBAAmB;AACpC,QAAM,SAAS,qBAAqB,QAAQ;AAC5C,QAAM,YAAY,OAAO,aAAa,QAAQ,IAAI,SAAS,MAAM,UAAU;AAC3E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,SAAS;AAAA,MAClB;AAAA,MACA,QAAQ,CAAC,OAAO;AAAA,MAChB,YAAYA,MAAK,UAAU,gBAAgB;AAAA,MAC3C,UAAU;AAAA,MACV,OAAO,SAAS,OAAO;AAAA,MACvB,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa,SAAS,MAAM;AAAA,MAC5B,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,aAAa,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO,OAAO;AAAA,IACpD;AAAA,EACF;AACA,QAAM,cAAwB,CAAC;AAC/B,QAAM,WAAsE,CAAC;AAC7E,QAAM,SAAS,oBAAI,IAAI,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO,OAAO,CAAC;AAC7D,aAAW,SAAS,SAAS,QAAQ;AACnC,UAAM,eAAe,uBAAuB,UAAU,KAAK;AAC3D,QAAI,CAAC,OAAO,IAAI,YAAY,EAAG;AAC/B,UAAM,SAAS,qBAAqB,UAAU,OAAO,SAAS;AAC9D,QAAI,CAAC,UAAU,WAAW,MAAM,MAAM,MAAM,iBAAiB;AAC3D,kBAAY,KAAK,YAAY;AAC7B;AAAA,IACF;AACA,aAAS,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,EACjC;AACA,MAAI,OAAO,cAAc;AACvB,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,mBAAmB,UAAU,KAAK,KAAK;AACtD,MAAAK,WAAUH,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,MAAAK,cAAa,KAAK,QAAQ,MAAM;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,SAAS;AAAA,IAClB;AAAA,IACA,QAAQ,CAAC,OAAO;AAAA,IAChB,YAAYP,MAAK,UAAU,gBAAgB;AAAA,IAC3C,UAAU,OAAO,eAAe,SAAS,SAAS;AAAA,IAClD,OAAO,SAAS,OAAO;AAAA,IACvB,eAAe,OAAO,eAAe,IAAI,SAAS;AAAA,IAClD,iBAAiB;AAAA,IACjB,YAAY,SAAS,MAAM;AAAA,IAC3B,aAAa,SAAS,MAAM;AAAA,IAC5B,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,IAAI,OAAe,MAAc,QAAwB;AAChE,SAAO;AAAA,kDACyC,IAAI;AAAA,iFAC2B,MAAM;AAAA,sIAC+C,KAAK;AAAA,6HACd,MAAM;AAAA;AAAA;AAGnI;AAEA,SAAS,WAAW,OAA0C;AAC5D,SAAO,SAASI,YAAW,QAAQ,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;AACpH;AAEA,SAAS,eAAuC;AAC9C,SAAO,OAAO,YAAY,WAAW,IAAI,WAAS,CAAC,MAAM,KAAK,WAAW,KAAK,CAAC,CAAC,CAAC;AACnF;AAEA,SAAS,cAAc,SAAiB,OAAwC;AAC9E,QAAM,OAAO,aAAa,SAAS,KAAK;AACxC,EAAAC,WAAUH,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAI,eAAc,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,CAAC;AAChE;AAEA,SAAS,eAAe,SAAyC;AAC/D,QAAM,MAAM,aAAa;AACzB,aAAW,SAAS,WAAY,eAAc,SAAS,KAAK;AAC5D,SAAO;AACT;AAEA,SAAS,sBAAsB,SAA0C;AACvE,QAAM,SAAS,4BAA4B,OAAO;AAClD,MAAI,CAACH,YAAW,MAAM,EAAG,OAAM,IAAI,MAAM,6CAA6C,QAAQ,IAAI,EAAE;AACpG,QAAM,OAAOF,cAAa,MAAM;AAChC,MAAI,KAAK,WAAW,QAAQ,WAAY,OAAM,IAAI,MAAM,kDAAkD,QAAQ,IAAI,EAAE;AACxH,QAAM,iBAAiB,UAAU,IAAI;AACrC,MAAI,mBAAmB,QAAQ,gBAAiB,OAAM,IAAI,MAAM,qDAAqD,QAAQ,IAAI,EAAE;AACnI,SAAO;AAAA,IACL,SAAS,SAAS,eAAe,MAAM,GAAG,EAAE,CAAC;AAAA,IAC7C;AAAA,IACA,WAAW,KAAK;AAAA,EAClB;AACF;AAEA,SAAS,2BAA2B,UAA8B;AAChE,aAAW,WAAW,SAAS,mBAAmB,CAAC,GAAG;AACpD,0BAAsB,OAAO;AAC7B,UAAM,SAAS,yBAAyB,UAAU,OAAO;AACzD,IAAAI,WAAUH,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,IAAAK,cAAa,4BAA4B,OAAO,GAAG,MAAM;AAAA,EAC3D;AACF;AAEA,SAAS,iBAAiB,SAAiB,KAA6B;AACtE,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,SAAS,SAASP,MAAK,UAAU,SAAS,UAAU,cAAc,GAAG,WAAW,SAAS;AAChG,UAAM,iBAAiB,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUvC;AACD,UAAM,kBAAkB,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIxC;AACD,eAAW,SAAS,YAAY;AAC9B,YAAM,OAAO,IAAI,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;AACtD,qBAAe;AAAA,QACb,IAAI,MAAM,GAAG;AAAA,QACb;AAAA,QACA,iBAAiB,SAAS,KAAK;AAAA,QAC/BI,YAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAAA,QAC9C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO,WAAW,IAAI;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,sBAAgB,IAAI,IAAI,MAAM,GAAG,GAAG,SAAS;AAAA,IAC/C;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,EAAE,SAAS,GAAG,OAAO,WAAW,QAAQ,OAAO,WAAW,OAAO;AAC1E;AAEA,SAAS,uBAAuB,SAAiB,UAA8B;AAC7E,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,aAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhB,EAAE,IAAI,SAAS,SAASJ,MAAK,UAAU,SAAS,UAAU,cAAc,GAAG,WAAW,SAAS;AAChG,UAAM,iBAAiB,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUvC;AACD,UAAM,kBAAkB,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIxC;AACD,eAAW,SAAS,SAAS,QAAQ;AACnC,qBAAe;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,uBAAuB,UAAU,KAAK;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,sBAAgB,IAAI,MAAM,UAAU,SAAS;AAAA,IAC/C;AACA,eAAW,WAAW,SAAS,mBAAmB,CAAC,GAAG;AACpD,YAAM,YAAY,sBAAsB,OAAO;AAC/C,qBAAe;AAAA,QACb,UAAU;AAAA,QACV;AAAA,QACA,6BAA6B,UAAU,OAAO;AAAA,QAC9C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,sBAAgB,IAAI,UAAU,SAAS,SAAS;AAAA,IAClD;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACA,QAAM,eAAe,SAAS,iBAAiB,UAAU;AACzD,SAAO,EAAE,SAAS,GAAG,OAAO,SAAS,OAAO,SAAS,cAAc,OAAO,SAAS,OAAO,SAAS,aAAa;AAClH;AAEA,SAAS,+BAA+B,SAAiB,UAA8B;AACrF,QAAM,WAAW,SAAS,mBAAmB,CAAC;AAC9C,MAAI,SAAS,WAAW,EAAG,QAAO,EAAE,OAAO,EAAE;AAC7C,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,OAAO;AACzB,MAAI;AACF,aAAS,KAAK,iBAAiB;AAC/B,QAAI;AACF,YAAM,QAAQ,IAAI,IAAI,SAAS,IAAI,aAAW,QAAQ,aAAa,CAAC;AACpE,iBAAW,eAAe,OAAO;AAC/B,iBAAS,QAAQ,qFAAqF,EAAE,IAAI,SAAS,WAAW;AAAA,MAClI;AACA,YAAM,YAAY,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAclC;AACD,iBAAW,WAAW,UAAU;AAC9B,cAAM,YAAY,sBAAsB,OAAO;AAC/C,kBAAU;AAAA,UACR,GAAG,OAAO,IAAI,QAAQ,aAAa,YAAY,QAAQ,aAAa;AAAA,UACpE;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,6BAA6B,UAAU,OAAO;AAAA,UAC9C,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,QAAQ,UAAU,IAAI;AAAA,QACxB;AAAA,MACF;AACA,iBAAW,eAAe,OAAO;AAC/B,cAAM,eAAe,SAAS,QAAQ,yGAAyG,EAAE,IAAI,SAAS,WAAW;AACzK,YAAI,aAAa,UAAU,GAAG;AAC5B,mBAAS,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAShB,EAAE,IAAI,WAAW,SAAS,WAAW;AAAA,QACxC;AAAA,MACF;AACA,eAAS,KAAK,QAAQ;AAAA,IACxB,SAAS,OAAO;AACd,eAAS,KAAK,UAAU;AACxB,YAAM;AAAA,IACR;AAAA,EACF,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,EAAE,OAAO,SAAS,OAAO;AAClC;AAEO,SAAS,yBAAyB,SAAiB,QAAuD;AAC/G,QAAM,MAAM,OAAO,eAAe,eAAe,OAAO,IAAI,aAAa;AACzE,QAAM,cAAc,IAAI;AACxB,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,cAAc,mBAAmB,SAAS,WAAW;AAAA,MACrD,WAAW,eAAe,OAAO;AAAA,IACnC;AAAA,EACF;AACA,QAAM,UAAU,iBAAiB,SAAS,GAAG;AAC7C,aAAW,CAAC,QAAQ,KAAK,KAAK,WAAW;AACvC,sBAAkB,SAAS,EAAE,eAAe,IAAI,MAAM,GAAG,cAAc,IAAI,KAAK,GAAG,cAAc,KAAK,CAAC;AAAA,EACzG;AACA,sBAAoB,SAAS;AAAA,IAC3B,SAAS,IAAI;AAAA,IACb,cAAc;AAAA,IACd,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACD,sBAAoB,SAAS;AAAA,IAC3B,cAAc;AAAA,IACd;AAAA,IACA,WAAW,CAAC,GAAG,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,OAAO,EAAE,SAAS,IAAI,GAAG,GAAG,GAAG,SAAS,EAAE;AAAA,EAC7F,CAAC;AACD,QAAM,YAAY,uBAAuB,SAAS;AAAA,IAChD,UAAU,OAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,EACT,CAAC,EAAE;AACH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,UAAU,kBAAkB;AAAA,IACrC,WAAW,eAAe,OAAO;AAAA,IACjC,eAAe;AAAA,IACf,mBAAmB,IAAI;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCAAgC,SAAiB,QAAuD;AACtH,QAAM,WAAW,mBAAmB;AACpC,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,SAAS;AAAA,MAClB,eAAe,SAAS;AAAA,MACxB,cAAc,mBAAmB,SAAS,SAAS,aAAa;AAAA,MAChE,cAAc,8BAA8B,OAAO;AAAA,IACrD;AAAA,EACF;AACA,6BAA2B,QAAQ;AACnC,QAAM,UAAU,uBAAuB,SAAS,QAAQ;AACxD,aAAW,QAAQ,SAAS,OAAO;AACjC,sBAAkB,SAAS,EAAE,eAAe,KAAK,QAAQ,cAAc,KAAK,OAAO,cAAc,KAAK,CAAC;AAAA,EACzG;AACA,QAAM,kBAAkB,+BAA+B,SAAS,QAAQ;AACxE,sBAAoB,SAAS;AAAA,IAC3B,UAAU,SAAS;AAAA,IACnB,cAAc;AAAA,IACd,eAAe,SAAS,mBAAmB;AAAA,IAC3C,OAAO;AAAA,IACP,aAAa,SAAS;AAAA,EACxB,CAAC;AACD,sBAAoB,SAAS;AAAA,IAC3B,cAAc;AAAA,IACd,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS,OAAO,IAAI,YAAU,EAAE,SAAS,MAAM,UAAU,GAAG,MAAM,SAAS,EAAE;AAAA,EAC1F,CAAC;AACD,QAAM,YAAY,uBAAuB,SAAS;AAAA,IAChD,UAAU,OAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,OAAO,SAAS;AAAA,EAClB,CAAC,EAAE;AACH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,UAAU,SAAS,KAAK;AAAA,IACjC,SAAS,SAAS;AAAA,IAClB,cAAc,8BAA8B,OAAO;AAAA,IACnD,eAAe,SAAS;AAAA,IACxB,oBAAoB,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,SAAiB,cAAuB;AAClF,QAAM,MAAM,aAAa;AACzB,QAAM,cAAc,IAAI;AACxB,MAAI;AACJ,MAAI;AACF,eAAW,wBAAwB,SAAS,mBAAmB,SAAS,WAAW,GAAG,YAAY;AAAA,EACpG,SAAS,OAAO;AACd,QAAI,CAAC,wBAAwB,KAAK,KAAK,MAAM,WAAW,IAAK,OAAM;AACnE,eAAW,EAAE,IAAI,MAAe,SAAS,wCAAwC,WAAW,KAAK;AAAA,EACnG;AACA,MAAI,aAAc,QAAO,eAAe,OAAO,GAAG,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAClF,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,eAAe,YAAY,kBAAkB,KAAK,iBAAiB,kBAAkB;AAAA,IAC9F,WAAW,eAAe,OAAO;AAAA,IACjC,eAAe;AAAA,IACf;AAAA,EACF;AACF;;;ACjvBO,SAAS,+BAA+BQ,MAAsBC,cAA0BC,aAA8B;AAC3H,EAAAF,KAAI,IAAI,2BAA2BE,YAAW,CAAC,KAAK,QAAQ;AAC1D,QAAI,KAAK,sBAAsBD,aAAY,GAAG,CAAC,CAAC;AAAA,EAClD,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,2BAA2BE,YAAW,CAAC,KAAK,QAAQ;AAC3D,UAAM,UAAUD,aAAY,GAAG;AAC/B,QAAI,IAAI,KAAK,iBAAiB,KAAM,oBAAmB,OAAO;AAC9D,QAAI,KAAK,uBAAuB,SAAS;AAAA,MACvC,aAAa,OAAO,IAAI,KAAK,eAAe,EAAE;AAAA,MAC9C,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,QAAQ,IAAI,KAAK,WAAW,YAAY,IAAI,KAAK,WAAW,aAAa,IAAI,KAAK,SAAS;AAAA,MAC3F,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,WAAW,IAAI,KAAK,cAAc,WAAW,IAAI,KAAK,cAAc,WAAW,IAAI,KAAK,YAAY;AAAA,MACpG,UAAU,IAAI,KAAK,aAAa;AAAA,MAChC,cAAc,IAAI,KAAK,iBAAiB;AAAA,IAC1C,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,qCAAqCE,YAAW,CAAC,KAAK,QAAQ;AACrE,QAAI,KAAK,yBAAyBD,aAAY,GAAG,GAAG;AAAA,MAClD,UAAU,IAAI,KAAK,aAAa;AAAA,MAChC,cAAc,IAAI,KAAK,iBAAiB;AAAA,IAC1C,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,wCAAwCE,YAAW,CAAC,KAAK,QAAQ;AACxE,QAAI,KAAK,4BAA4BD,aAAY,GAAG,GAAG,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EACxF,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,gDAAgDE,YAAW,CAAC,KAAK,QAAQ;AAChF,QAAI,KAAK,gCAAgCD,aAAY,GAAG,GAAG;AAAA,MACzD,UAAU,IAAI,KAAK,aAAa;AAAA,MAChC,cAAc,IAAI,KAAK,iBAAiB;AAAA,IAC1C,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,sCAAsCE,YAAW,CAAC,KAAK,QAAQ;AACrE,QAAI,KAAK,EAAE,IAAI,MAAM,QAAQ,oBAAoBD,aAAY,GAAG,CAAC,EAAE,CAAC;AAAA,EACtE,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,iDAAiDE,YAAW,CAAC,KAAK,QAAQ;AAChF,QAAI,KAAK,EAAE,IAAI,MAAM,QAAQ,8BAA8BD,aAAY,GAAG,CAAC,EAAE,CAAC;AAAA,EAChF,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,8CAA8CE,YAAW,CAAC,KAAK,QAAQ;AAC9E,QAAI,KAAK,EAAE,IAAI,MAAM,QAAQ,qBAAqBD,aAAY,GAAG,GAAG,EAAE,cAAc,IAAI,KAAK,iBAAiB,KAAK,CAAC,EAAE,CAAC;AAAA,EACzH,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,yDAAyDE,YAAW,CAAC,KAAK,QAAQ;AACzF,QAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ,+BAA+BD,aAAY,GAAG,GAAG;AAAA,QACvD,cAAc,IAAI,KAAK,iBAAiB;AAAA,QACxC,WAAW,OAAO,IAAI,KAAK,cAAc,WAAW,IAAI,KAAK,YAAY;AAAA,MAC3E,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,0DAA0DE,YAAW,OAAO,KAAK,QAAQ;AAChG,QAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ,MAAM,gCAAgCD,aAAY,GAAG,GAAG;AAAA,QAC9D,cAAc,IAAI,KAAK,iBAAiB;AAAA,MAC1C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,EAAAD,KAAI,IAAI,wCAAwCE,YAAW,CAAC,KAAK,QAAQ;AACvE,QAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,SAASD,aAAY,GAAG;AAAA,MACxB,WAAW,wBAAwBA,aAAY,GAAG,GAAG,IAAI,OAAO,WAAW;AAAA,IAC7E,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,wCAAwCE,YAAW,CAAC,KAAK,QAAQ;AACxE,QAAI,KAAK,uBAAuBD,aAAY,GAAG,GAAG,IAAI,OAAO,aAAa;AAAA,MACxE,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,QAAQ,IAAI,KAAK,WAAW,YAAY,IAAI,KAAK,WAAW,YAAY,IAAI,KAAK,WAAW,aAAa,IAAI,KAAK,SAAS;AAAA,MAC3H,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,MAC7D,UAAU,IAAI,KAAK,aAAa;AAAA,MAChC,cAAc,IAAI,KAAK,iBAAiB;AAAA,IAC1C,CAAC,CAAC;AAAA,EACJ,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,iDAAiDE,YAAW,CAAC,KAAK,QAAQ;AACjF,QAAI,KAAK,yBAAyBD,aAAY,GAAG,GAAG,IAAI,OAAO,aAAa,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAC7G,CAAC,CAAC;AAEF,EAAAD,KAAI,KAAK,gDAAgDE,YAAW,CAAC,KAAK,QAAQ;AAChF,QAAI,KAAK,wBAAwBD,aAAY,GAAG,GAAG,IAAI,OAAO,aAAa,IAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAC5G,CAAC,CAAC;AACJ;;;ArC5EA,IAAM,MAAME,SAAQ;AACpB,IAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,IAAI;AAC5C,IAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,IAAM,eAAe,QAAQ,IAAI,aAAa;AAC9C,IAAM,iBAAiB,OAAO,QAAQ,IAAI,yBAAyB,GAAG,IAAI,OAAO;AACjF,IAAM,SAAS,OAAO,EAAE,MAAM,gBAAgB,GAAG,QAAQ,EAAE,UAAU,eAAe,EAAE,CAAC;AACvF,IAAI,IAAIA,SAAQ,KAAK,EAAE,OAAO,MAAM,CAAC,CAAC;AACtC,SAAS,YAAY,OAAoF;AACvG,QAAM,YAAY,MAAM,MAAM,WAAW,MAAM,MAAM,WAAW,MAAM,OAAO,WAAW,MAAM,OAAO;AACrG,SAAO,OAAO,cAAc,WAAW,YAAY;AACrD;AAEA,SAAS,WAAW,SAAwG;AAC1H,SAAO,CAAC,KAAK,KAAK,SAAS;AAAE,YAAQ,QAAQ,QAAQ,KAAK,GAAG,CAAC,EAAE,MAAM,IAAI;AAAA,EAAG;AAC/E;AACA,IAAI,IAAI,iBAAiB,WAAW,CAAC,MAAM,QAAQ;AAAE,MAAI,KAAK,EAAE,UAAU,aAAa,EAAE,CAAC;AAAG,CAAC,CAAC;AAC/F,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,UAAU,YAAY,GAAG;AAC/B,UAAM,WAAW,WAAW,SAAS;AAAA,MACnC,UAAU,OAAO,IAAI,MAAM,aAAa,WAAW,IAAI,MAAM,WAAW;AAAA,MACxE,UAAU,OAAO,IAAI,MAAM,aAAa,WAAW,IAAI,MAAM,WAAW;AAAA,MACxE,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU;AAAA,MACrE,aAAa,IAAI,MAAM,SAAS;AAAA,MAChC,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,MAChC,UAAU,OAAO,IAAI,MAAM,YAAY,EAAE;AAAA,MACzC,iBAAiB,OAAO,IAAI,MAAM,oBAAoB,WAAW,IAAI,MAAM,kBAAkB;AAAA,MAC7F,OAAO,OAAO,IAAI,MAAM,MAAM,WAAW,IAAI,MAAM,IAAI;AAAA,MACvD,QAAQ,OAAO,IAAI,MAAM,WAAW,WAAW,IAAI,MAAM,SAAS;AAAA,MAClE,QAAQ,OAAO,IAAI,MAAM,WAAW,WAAW,IAAI,MAAM,SAAS;AAAA,MAClE,MAAM,OAAO,IAAI,MAAM,SAAS,WAAW,IAAI,MAAM,OAAO;AAAA,IAC9D,CAAC;AACD,QAAI,KAAK,wBAAwB,SAAS,QAAQ,CAAC;AAAA,EACrD,CAAC;AACH;AACA,IAAI,IAAI,eAAe,WAAW,CAAC,KAAK,QAAQ;AAAE,MAAI,KAAK,uBAAuB,YAAY,GAAG,GAAG,IAAI,KAAK,CAAC;AAAG,CAAC,CAAC;AACnH,IAAI,KAAK,sBAAsB,WAAW,CAAC,KAAK,QAAQ;AAAE,MAAI,KAAK,aAAa,YAAY,GAAG,GAAG,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC;AAAG,CAAC,CAAC;AAC7K,sBAAsB,KAAK,aAAa,UAAU;AAClD,yBAAyB,KAAK,aAAa,UAAU;AACrD,IAAI,IAAI,gBAAgB,mBAAmB,WAAW,CAAC;AACvD,IAAI,IAAI,mBAAmB,qBAAqB,WAAW,CAAC;AAC5D,IAAI,IAAI,wBAAwB,WAAW,CAAC,KAAK,QAAQ;AAAE,MAAI,KAAK,wBAAwB,YAAY,GAAG,GAAG,EAAE,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU,QAAW,aAAa,OAAO,IAAI,MAAM,gBAAgB,WAAW,IAAI,MAAM,cAAc,QAAW,OAAO,OAAO,IAAI,MAAM,SAAS,EAAE,EAAE,CAAC,CAAC;AAAG,CAAC,CAAC;AACxU,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI;AAAA,MACF,eAAe,YAAY,GAAG,GAAG;AAAA,QAC/B,SAAS,OAAO,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,UAAU;AAAA,QACrE,OAAO,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,OAAO,IAAI,MAAM,SAAS,UAAU;AACtC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA8B,CAAC;AAC7D;AAAA,IACF;AACA,QAAI,SAASC,kBAAiB,IAAI,MAAM,IAAI,CAAC;AAAA,EAC/C,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,EAAE,IAAI,MAAM,SAAS,eAAe,SAAS,YAAY,GAAG,GAAG,SAAS,mBAAmB,YAAY,GAAG,CAAC,EAAE,CAAC;AAAA,EACzH,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,oBAAoB,YAAY,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AAAA,EACpE,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,gBAAgB,YAAY,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AAAA,EAChE,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,mBAAmB,YAAY,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AAAA,EACnE,CAAC;AACH;AAEA,+BAA+B,KAAK,aAAa,UAAU;AAC3D,0BAA0B,KAAK,aAAa,UAAU;AAEtD,IAAI,IAAI,qCAAqC,WAAW,CAAC,KAAK,QAAQ;AACpE,MAAI,KAAK,0BAA0B,YAAY,GAAG,GAAG,IAAI,OAAO,WAAW,CAAC;AAC9E,CAAC,CAAC;AAEF,IAAI,KAAK,kDAAkD,WAAW,CAAC,KAAK,QAAQ;AAClF,MAAI,KAAK,yBAAyB,YAAY,GAAG,GAAG;AAAA,IAClD,aAAa,IAAI,OAAO;AAAA,IACxB,aAAa,IAAI,OAAO;AAAA,IACxB,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,IAC7D,aAAa,IAAI,KAAK,gBAAgB,WAAW,IAAI,KAAK,gBAAgB,WAAW,IAAI,KAAK,cAAc;AAAA,IAC5G,cAAc,IAAI,KAAK,iBAAiB;AAAA,EAC1C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,KAAK,yDAAyD,WAAW,CAAC,KAAK,QAAQ;AACzF,MAAI,KAAK,0BAA0B,YAAY,GAAG,GAAG;AAAA,IACnD,aAAa,IAAI,OAAO;AAAA,IACxB,aAAa,IAAI,OAAO;AAAA,IACxB,cAAc,IAAI,KAAK,iBAAiB;AAAA,EAC1C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,IAAI,mDAAmD,WAAW,CAAC,KAAK,QAAQ;AAClF,MAAI,KAAK,mBAAmB,YAAY,GAAG,GAAG,IAAI,OAAO,aAAa,IAAI,OAAO,WAAW,CAAC;AAC/F,CAAC,CAAC;AAEF,IAAI,KAAK,2DAA2D,WAAW,CAAC,KAAK,QAAQ;AAC3F,MAAI,KAAK,sBAAsB,YAAY,GAAG,GAAG;AAAA,IAC/C,aAAa,IAAI,OAAO;AAAA,IACxB,aAAa,IAAI,OAAO;AAAA,IACxB,WAAW,OAAO,IAAI,KAAK,aAAa,EAAE;AAAA,IAC1C,cAAc,IAAI,KAAK,iBAAiB;AAAA,EAC1C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,IAAI,yBAAyB,WAAW,CAAC,KAAK,QAAQ;AAAE,MAAI,KAAK,mBAAmB,YAAY,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AAAG,CAAC,CAAC;AAElI,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI;AAAA,MACF,kBAAkB,YAAY,GAAG,GAAG;AAAA,QAClC,eAAe,OAAO,IAAI,KAAK,iBAAiB,EAAE;AAAA,QAClD,cAAc,OAAO,IAAI,KAAK,gBAAgB,EAAE;AAAA,QAChD,cAAc,IAAI,KAAK,iBAAiB;AAAA,QACxC,YAAY,sBAAsB,GAAG;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI,KAAK,4BAA4B,WAAW,CAAC,KAAK,QAAQ;AAC5D,MAAI,KAAK,kBAAkB,YAAY,GAAG,GAAG,EAAE,SAAS,OAAO,IAAI,KAAK,WAAW,EAAE,GAAG,aAAa,OAAO,IAAI,KAAK,gBAAgB,WAAW,IAAI,KAAK,cAAc,QAAW,cAAc,IAAI,KAAK,iBAAiB,MAAM,YAAY,sBAAsB,GAAG,EAAE,CAAC,CAAC;AAC3Q,CAAC,CAAC;AAEF,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,YAAa,MAAM,QAAQ,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,YAAY,CAAC;AAC7E,QAAI;AAAA,MACF,oBAAoB,YAAY,GAAG,GAAG;AAAA,QACpC,aAAa,OAAO,IAAI,KAAK,eAAe,EAAE;AAAA,QAC9C,WAAW,UAAU,IAAI,eAAa;AAAA,UACpC,SAAS,OAAO,SAAS,WAAW,EAAE;AAAA,UACtC,GAAG,OAAO,SAAS,CAAC;AAAA,UACpB,GAAG,OAAO,SAAS,CAAC;AAAA,QACtB,EAAE;AAAA,QACF,cAAc,IAAI,KAAK,iBAAiB;AAAA,QACxC,YAAY,sBAAsB,GAAG;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI;AAAA,MACF,yBAAyB,YAAY,GAAG,GAAG;AAAA,QACzC,aAAa,OAAO,IAAI,KAAK,gBAAgB,WAAW,IAAI,KAAK,cAAc;AAAA,QAC/E,cAAc,OAAO,IAAI,KAAK,gBAAgB,EAAE;AAAA,QAChD,cAAc,IAAI,KAAK,iBAAiB;AAAA,QACxC,YAAY,sBAAsB,GAAG;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI;AAAA,MACF,oBAAoB,YAAY,GAAG,GAAG;AAAA,QACpC,SAAS,OAAO,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,UAAU;AAAA,QACnE,UAAU,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI;AAAA,QAC7E,aAAa,OAAO,IAAI,KAAK,gBAAgB,WAAW,IAAI,KAAK,cAAc;AAAA,QAC/E,OAAO,IAAI,KAAK,UAAU;AAAA,QAC1B,eAAe,OAAO,IAAI,KAAK,kBAAkB,WAAW,IAAI,KAAK,gBAAgB;AAAA,QACrF,MAAM,IAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,YAAY,IAAI,KAAK,OAAO;AAAA,QAC3I,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,QAC7D,cAAc,IAAI,KAAK,iBAAiB;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI;AAAA,MACF,kBAAkB,YAAY,GAAG,GAAG;AAAA,QAClC,SAAS,IAAI,OAAO;AAAA,QACpB,aAAa,OAAO,IAAI,KAAK,eAAe,YAAY;AAAA,QACxD,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,QAC7D,cAAc,IAAI,KAAK,iBAAiB;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,gCAAgC,YAAY,GAAG,GAAG,IAAI,IAA+B,CAAC;AAAA,EACjG,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,WAAW,OAAO,IAAI,KAAK,eAAe,IAAI,KAAK,SAAS,YAAY;AAC9E,QAAI;AAAA,MACF,gBAAgB,YAAY,GAAG,GAAG;AAAA,QAChC,SAAS,IAAI,OAAO;AAAA,QACpB,aAAa,SAAS,QAAQ,MAAM,GAAG;AAAA,QACvC,OAAO,OAAO,IAAI,KAAK,UAAU,WAAW,IAAI,KAAK,QAAQ;AAAA,QAC7D,cAAc,IAAI,KAAK,iBAAiB;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,aAAa,YAAY,GAAG,GAAG,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,aAAa,GAAG,CAAC,CAAC;AAAA,EAC9F,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,aAAa,YAAY,GAAG,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,YAAY,CAAC,CAAC;AAAA,EAC3F,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,UAAU,YAAY,GAAG,GAAG,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,QAAQ,WAAW,IAAI,KAAK,MAAM,gBAAgB,CAAC;AAAA,EAC5H,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,aAAa,YAAY,GAAG,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,cAAc,CAAC,CAAC;AAAA,EAC7F,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,OAAO,IAAI;AACjB,UAAM,SAA0B;AAAA,MAC9B,SAAS,OAAO,KAAK,WAAW,EAAE;AAAA,MAClC,SAAS,OAAO,KAAK,WAAW,EAAE;AAAA,MAClC,QAAQ,OAAO,KAAK,UAAU,SAAS;AAAA,MACvC,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,MACvE,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,MAC9D,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,MAC/C,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,cAAc,KAAK,iBAAiB;AAAA,IACtC;AACA,QAAI,KAAK,gBAAgB,YAAY,GAAG,GAAG,MAAM,CAAC;AAAA,EACpD,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,QAAI,KAAK,oBAAoB,YAAY,GAAG,GAAG,IAAI,KAAK,SAAS,IAAI,KAAK,gBAAgB,EAAE,CAAC;AAAA,EAC/F,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,OAAO,OAAO,MAAM;AAAA,EACpB,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,OAAO,IAAI,MAAM;AACvB,QAAI;AACF,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,wBAAwB;AACnD,YAAM,OAAO,IAAI;AACjB,YAAM,SAAuB;AAAA,QAC3B,SAAS,KAAK,WAAW,KAAK,WAAW;AAAA,QACzC,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK,WAAW,cAAc,cAAc;AAAA,QACpD,MAAO,KAAK,QAAQ;AAAA,QACpB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK;AAAA,QACpB,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,cAAc,KAAK,iBAAiB;AAAA,MACtC;AACA,UAAI,KAAK,YAAY,MAAM,MAAM,CAAC;AAAA,IACpC,UAAE;AACA,0BAAoB,IAAI;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AAEA,IAAI;AAAA,EACF;AAAA,EACA,WAAW,CAAC,KAAK,QAAQ;AACvB,UAAM,OAAO,IAAI;AACjB,UAAM,UAAU,YAAY,GAAG;AAC/B,UAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4BAA4B;AACvD,UAAM,OAAOA,kBAAiB,IAAI;AAClC,UAAM,SAAuB;AAAA,MAC3B;AAAA,MACA,SAAS,OAAO,KAAK,WAAW,EAAE;AAAA,MAClC,UAAU,OAAO,KAAK,YAAY,EAAE;AAAA,MACpC,UAAU,OAAO,KAAK,YAAY,EAAE;AAAA,MACpC,SAAS,OAAO,KAAK,WAAW,EAAE;AAAA,MAClC,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,MAC1B,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,MAC5B,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,QAAQ,KAAK,WAAW,cAAc,cAAc;AAAA,MACpD,OAAO,OAAO,KAAK,SAAS,EAAE;AAAA,MAC9B,MAAO,KAAK,QAAQ;AAAA,MACpB,YAAY,OAAO,KAAK,cAAc,EAAE;AAAA,MACxC,cAAc,KAAK,iBAAiB;AAAA,IACtC;AACA,QAAI,KAAK,WAAW,MAAM;AACxB,UAAI,KAAK,EAAE,IAAI,MAAM,SAAS,oBAAoB,OAAO,OAAO,IAAI,QAAQ,EAAE,QAAQ,MAAM,MAAM,OAAO,EAAE,CAAC;AAC5G;AAAA,IACF;AACA,UAAM,gBAAgB,+BAA+B,SAAS,IAAI;AAClE,QAAI,KAAK,YAAY,cAAc,OAAO,iBAAiB,MAAM,MAAM,CAAC;AAAA,EAC1E,CAAC;AACH;AACA,IAAI,cAAc;AAChB,QAAM,OAAOC,MAAK,UAAU,QAAQ,KAAK;AACzC,MAAIC,YAAW,IAAI,GAAG;AACpB,QAAI,IAAIH,SAAQ,OAAO,IAAI,CAAC;AAAG,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ,IAAI,SAASE,MAAK,MAAM,YAAY,CAAC,CAAC;AAAA,EACnG;AACF,OAAO;AACL,QAAM,EAAE,cAAc,iBAAiB,IAAI,MAAM,OAAO,MAAM;AAC9D,QAAM,UAAU,QAAQ,IAAI,mBAAmB,OAAO,QAAQ,IAAI,gBAAgB,IAAI;AACtF,QAAM,OAAO,MAAM,iBAAiB;AAAA,IAClC,YAAYA,MAAK,UAAU,gBAAgB;AAAA,IAC3C,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,GAAI,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,IAAK,EAAE,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,MAAI,IAAI,KAAK,WAAW;AAC1B;AAEA,IAAI,IAAI,CAAC,OAAgB,MAAuB,KAAuB,UAAgC;AACrG,MAAI,iBAAiB,OAAO,eAAe,MAAM,SAAS,mBAAmB;AAC3E,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,KAAK,MAAM,iBAAiB,OAAO,IAAI,CAAC,MAAM,CAAC;AAC/F;AAAA,EACF;AACA,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,mBAAmB,KAAK,GAAG;AAAE,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAG;AAAA,EAAQ;AAClG,MAAI,sBAAsB,KAAK,GAAG;AAAE,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAG;AAAA,EAAQ;AACrG,MAAI,mBAAmB,KAAK,GAAG;AAC7B,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,sBAAsB,KAAK,GAAG;AAChC,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,uBAAuB,KAAK,GAAG;AAAE,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAG;AAAA,EAAQ;AACtG,MAAI,sBAAsB,KAAK,GAAG;AAChC,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,yBAAyB,KAAK,GAAG;AAAE,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAG;AAAA,EAAQ;AACxG,MAAI,kBAAkB,KAAK,GAAG;AAC5B,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,MAAM,SAAS,MAAM,SAAS,WAAW,MAAM,UAAU,CAAC;AACvG;AAAA,EACF;AACA,MAAI,wBAAwB,KAAK,GAAG;AAClC,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,mBAAmB,KAAK,GAAG;AAC7B,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,MAAI,eAAe,KAAK,GAAG;AACzB,QAAI,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AACtD;AAAA,EACF;AACA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,QAAQ,CAAC;AACzC,CAAC;AAED,IAAI,OAAO,MAAM,MAAM,MAAM;AAAE,UAAQ,IAAI,+BAA+B,IAAI,IAAI,IAAI,EAAE;AAAG,CAAC;",
|
|
6
|
+
"names": ["express", "existsSync", "join", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "dirname", "join", "resolve", "existsSync", "statSync", "basename", "join", "repoRoot", "svg", "existsSync", "join", "basename", "statSync", "mkdirSync", "join", "require", "join", "mkdirSync", "join", "existsSync", "readFileSync", "dirname", "resolve", "svg", "escapeSvgText", "mkdirSync", "readdirSync", "localAssets", "localPreviewPath", "join", "mkdirSync", "resolve", "existsSync", "localAssets", "join", "randomBytes", "createHash", "createHash", "metadata", "ensureProject", "claim", "randomId", "randomBytes", "metadataJson", "metadata", "parseMetadata", "recordEvent", "statuses", "placeholders", "timestamp", "ensureProject", "normalizeStatus", "normalizeActor", "requireAsset", "channelOverlaps", "join", "requireAsset", "requireAsset", "placeholders", "attempt", "requireAsset", "requireAsset", "assetChannel", "parentOf", "rootFor", "edgeId", "upsertProject", "run", "reviewState", "placeholders", "results", "localAssetIds", "allAssets", "localAssets", "lanes", "setId", "setId", "actors", "ensureProject", "normalizeActor", "rowToItem", "itemsForSet", "rowToSet", "setId", "reviewSet", "projectFrom", "asyncRoute", "app", "projectFrom", "asyncRoute", "ensureProject", "mkdirSync", "writeFileSync", "join", "ensureProject", "requireText", "handoff", "assetFromRow", "batchFromRow", "assetsForPost", "postFromRow", "join", "mkdirSync", "writeFileSync", "app", "projectFrom", "asyncRoute", "existsSync", "readdirSync", "readFileSync", "basename", "join", "relative", "readdirSync", "join", "slug", "basename", "readFileSync", "relative", "existsSync", "localAssetIds", "laneFor", "laneFor", "stringBody", "boolBody", "claimTokenFromRequest", "projectFrom", "stringBody", "boolBody", "app", "projectFrom", "asyncRoute", "createHash", "copyFileSync", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "dirname", "join", "join", "readFileSync", "dirname", "existsSync", "createHash", "mkdirSync", "writeFileSync", "copyFileSync", "app", "projectFrom", "asyncRoute", "express", "localPreviewPath", "join", "existsSync"]
|
|
7
7
|
}
|