workplane 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -86
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/migrate.js +260 -41
- package/dist/migrate.js.map +1 -1
- package/dist/migrations/pg/0000_majestic_norman_osborn.sql +75 -0
- package/dist/migrations/pg/meta/0000_snapshot.json +583 -0
- package/dist/migrations/pg/meta/_journal.json +13 -0
- package/dist/migrations/sqlite/0000_dry_zarek.sql +75 -0
- package/dist/migrations/sqlite/meta/0000_snapshot.json +535 -0
- package/dist/migrations/sqlite/meta/_journal.json +13 -0
- package/dist/node.js +20 -17
- package/dist/node.js.map +1 -1
- package/dist/schema.sqlite.sql +74 -0
- package/dist/server.js +743 -335
- package/dist/server.js.map +1 -1
- package/dist/setup.js +410 -0
- package/dist/setup.js.map +1 -0
- package/package.json +8 -2
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../dbos/src/index.ts","../../server/src/index.ts","../../core/src/config.ts","../../core/src/env.ts","../../db/src/client.ts","../../core/src/ids.ts","../../server/src/store.ts","../../server/src/workflows-vanilla.ts","../../server/src/validation.ts","../../core/src/auth.ts","../../server/src/auth-middleware.ts"],"sourcesContent":["import { DBOS } from \"@dbos-inc/dbos-sdk\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n RunStatus,\n ServerWorkflows,\n TaskRecord,\n} from \"@workplane/types\";\n\nexport class DbosWorkflows implements ServerWorkflows {\n private readonly registered: ServerWorkflows;\n\n constructor(store: ServerWorkflows) {\n const createTask = DBOS.registerWorkflow(\n async (input: CreateTaskInput) =>\n DBOS.runStep(() => store.createTask(input), { name: \"store-create-task\" }),\n { name: \"createTaskWorkflow\" },\n );\n\n const retryTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.retryTask(taskId), { name: \"store-retry-task\" }),\n { name: \"retryTaskWorkflow\" },\n );\n\n const cancelTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.cancelTask(taskId), { name: \"store-cancel-task\" }),\n { name: \"cancelTaskWorkflow\" },\n );\n\n const updateRunStatus = DBOS.registerWorkflow(\n async (runId: string, status: RunStatus, error?: string) =>\n DBOS.runStep(() => store.updateRunStatus(runId, status, error), { name: \"store-update-run-status\" }),\n { name: \"updateRunStatusWorkflow\" },\n );\n\n const appendRunLogs = DBOS.registerWorkflow(\n async (runId: string, logs: RunLogInput[]) =>\n DBOS.runStep(() => store.appendRunLogs(runId, logs), { name: \"store-append-run-logs\" }),\n { name: \"appendRunLogsWorkflow\" },\n );\n\n const createArtifact = DBOS.registerWorkflow(\n async (runId: string, input: ArtifactInput) =>\n DBOS.runStep(() => store.createArtifact(runId, input), { name: \"store-create-artifact\" }),\n { name: \"createArtifactWorkflow\" },\n );\n\n const appendInputEvent = DBOS.registerWorkflow(\n async (runId: string, input: AppendInputEventInput) =>\n DBOS.runStep(() => store.appendInputEvent(runId, input), { name: \"store-append-input-event\" }),\n { name: \"appendInputEventWorkflow\" },\n );\n\n const markInputDelivered = DBOS.registerWorkflow(\n async (runId: string, sequence: number) =>\n DBOS.runStep(() => store.markInputDelivered(runId, sequence), { name: \"store-mark-input-delivered\" }),\n { name: \"markInputDeliveredWorkflow\" },\n );\n\n this.registered = {\n createTask,\n retryTask,\n cancelTask,\n updateRunStatus,\n appendRunLogs,\n createArtifact,\n appendInputEvent,\n markInputDelivered,\n };\n }\n\n async launch(options: {\n appName: string;\n systemDatabaseUrl: string;\n conductorKey?: string;\n conductorUrl?: string;\n }): Promise<void> {\n DBOS.setConfig({\n name: options.appName,\n systemDatabaseUrl: options.systemDatabaseUrl,\n });\n await DBOS.launch({\n conductorKey: options.conductorKey,\n conductorURL: options.conductorUrl,\n });\n }\n\n async shutdown(): Promise<void> {\n await DBOS.shutdown();\n }\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createTask)(input);\n return handle.getResult();\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.retryTask)(taskId);\n return handle.getResult();\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.cancelTask)(taskId);\n return handle.getResult();\n }\n\n async updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.updateRunStatus)(runId, status, error);\n return handle.getResult();\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n const handle = await DBOS.startWorkflow(this.registered.appendRunLogs)(runId, logs);\n return handle.getResult();\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createArtifact)(runId, input);\n return handle.getResult();\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n const handle = await DBOS.startWorkflow(this.registered.appendInputEvent)(runId, input);\n return handle.getResult();\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n const handle = await DBOS.startWorkflow(this.registered.markInputDelivered)(runId, sequence);\n await handle.getResult();\n }\n}\n\nexport function createDbosWorkflows(store: ServerWorkflows): DbosWorkflows {\n return new DbosWorkflows(store);\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { URL } from \"node:url\";\nimport { ZodError } from \"zod\";\nimport { loadServerConfig } from \"../../core/src/config.js\";\nimport { getPool } from \"../../db/src/client.js\";\nimport { PgStore } from \"./store.js\";\nimport type { AppendInputEventInput, ArtifactInput, CreateTaskInput, RunLogInput, RunStatus, ServerWorkflows } from \"../../types/src/index.js\";\nimport { VanillaWorkflows } from \"./workflows-vanilla.js\";\nimport { validateCreateTaskInput, validateInputEvent } from \"./validation.js\";\nimport { checkRouteAuth, requiresConfiguredToken, routeAuthFor } from \"./auth-middleware.js\";\n\nconst taskStatuses = new Set<RunStatus>([\"queued\", \"assigned\", \"running\", \"succeeded\", \"failed\", \"cancelled\"]);\n\nfunction parseStatus(value: string | null): RunStatus | undefined {\n if (!value) {\n return undefined;\n }\n if (!taskStatuses.has(value as RunStatus)) {\n throw new Error(`invalid status filter: ${value}`);\n }\n return value as RunStatus;\n}\n\nasync function readJson<T>(req: IncomingMessage): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const body = Buffer.concat(chunks).toString(\"utf8\");\n return (body ? JSON.parse(body) : {}) as T;\n}\n\nfunction writeJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n const json = JSON.stringify(payload);\n res.statusCode = statusCode;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(json);\n}\n\nasync function buildWorkflows(store: PgStore, config: { databaseUrl: string }): Promise<{\n workflows: ServerWorkflows;\n shutdown: () => Promise<void>;\n}> {\n if (process.env.WORKPLANE_USE_DBOS === \"true\") {\n const { createDbosWorkflows } = await import(\"../../dbos/src/index.js\");\n const dbos = createDbosWorkflows(store);\n await dbos.launch({\n appName: process.env.DBOS_APPLICATION_NAME ?? \"workplane-server\",\n systemDatabaseUrl: config.databaseUrl,\n conductorKey: process.env.DBOS_CONDUCTOR_KEY,\n conductorUrl: process.env.DBOS_CONDUCTOR_URL,\n });\n return { workflows: dbos, shutdown: () => dbos.shutdown() };\n }\n\n return { workflows: new VanillaWorkflows(store), shutdown: async () => {} };\n}\n\nasync function main(): Promise<void> {\n const config = loadServerConfig();\n const pool = getPool(config.databaseUrl);\n const store = new PgStore(pool);\n const { workflows, shutdown: shutdownWorkflows } = await buildWorkflows(store, config);\n\n const server = createServer(async (req, res) => {\n try {\n if (!req.url || !req.method) {\n writeJson(res, 400, { error: \"invalid request\" });\n return;\n }\n\n const url = new URL(req.url, \"http://localhost\");\n const routeAuth = routeAuthFor(req.method, url.pathname);\n const authConfig = { nodeToken: config.nodeToken, operatorToken: config.operatorToken };\n if (requiresConfiguredToken(routeAuth, authConfig) && !checkRouteAuth(req, res, routeAuth, authConfig)) {\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/healthz\") {\n writeJson(res, 200, { ok: true });\n return;\n }\n\n if (req.method === \"POST\" && url.pathname === \"/tasks\") {\n const body = await readJson<CreateTaskInput>(req);\n const validated = validateCreateTaskInput(body);\n const task = await workflows.createTask({\n kind: validated.kind,\n adapter: validated.adapter,\n payload: validated.payload,\n requires: validated.requires ?? [],\n });\n writeJson(res, 201, task);\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/tasks\") {\n const status = parseStatus(url.searchParams.get(\"status\"));\n const tasks = await store.listTasks(status);\n writeJson(res, 200, { tasks });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/tasks\\/[^/]+$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await store.getTask(taskId);\n if (!task) {\n writeJson(res, 404, { error: \"task not found\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/tasks\\/[^/]+\\/retry$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await workflows.retryTask(taskId);\n if (!task) {\n writeJson(res, 409, { error: \"task is not retryable\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/tasks\\/[^/]+\\/cancel$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await workflows.cancelTask(taskId);\n if (!task) {\n writeJson(res, 409, { error: \"task is not cancellable\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/runs\") {\n const taskId = url.searchParams.get(\"taskId\") ?? undefined;\n const status = parseStatus(url.searchParams.get(\"status\"));\n const runs = await store.listRuns({ taskId, status });\n writeJson(res, 200, { runs });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const run = await store.getRun(runId);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n writeJson(res, 200, run);\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/logs$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const logs = await store.getRunLogs(runId);\n writeJson(res, 200, { logs });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const artifacts = await store.listRunArtifacts(runId);\n writeJson(res, 200, { artifacts });\n return;\n }\n\n if (req.method === \"POST\" && url.pathname === \"/nodes/register\") {\n const body = await readJson<{ name: string; capabilities: string[]; nodeId?: string }>(req);\n const node = await store.registerNode(body.name, body.capabilities ?? [], body.nodeId);\n writeJson(res, 201, node);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/nodes\\/[^/]+\\/poll$/.test(url.pathname)) {\n const nodeId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ capabilities: string[] }>(req);\n const assignment = await store.pollNode(nodeId, body.capabilities ?? []);\n writeJson(res, 200, { assignment });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/status$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ status: RunStatus; error?: string }>(req);\n const run = await workflows.updateRunStatus(runId, body.status, body.error);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n writeJson(res, 200, run);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/logs$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ logs: RunLogInput[] }>(req);\n const inserted = await workflows.appendRunLogs(runId, body.logs ?? []);\n writeJson(res, 200, { inserted });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<ArtifactInput>(req);\n const artifact = await workflows.createArtifact(runId, body);\n writeJson(res, 201, artifact);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/input$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const run = await store.getRun(runId);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n if (run.status !== \"running\") {\n writeJson(res, 409, { error: \"run is not active\" });\n return;\n }\n const body = await readJson<AppendInputEventInput>(req);\n const validated = validateInputEvent(body);\n const event = await workflows.appendInputEvent(runId, validated);\n writeJson(res, 201, event);\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/input$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const afterSequence = Number(url.searchParams.get(\"afterSequence\") ?? \"0\");\n const events = await store.getInputEvents(runId, afterSequence);\n writeJson(res, 200, { events });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/input\\/\\d+\\/delivered$/.test(url.pathname)) {\n const parts = url.pathname.split(\"/\");\n const runId = parts[2];\n const sequence = Number(parts[4]);\n await workflows.markInputDelivered(runId, sequence);\n writeJson(res, 200, { ok: true });\n return;\n }\n\n writeJson(res, 404, { error: \"not found\" });\n } catch (error) {\n if (error instanceof ZodError) {\n writeJson(res, 400, { error: \"invalid task payload\", details: error });\n return;\n }\n if (error instanceof Error && error.message.startsWith(\"invalid status filter:\")) {\n writeJson(res, 400, { error: error.message });\n return;\n }\n const message = error instanceof Error ? error.message : \"internal error\";\n writeJson(res, 500, { error: message });\n }\n });\n\n server.listen(config.port, () => {\n process.stdout.write(`workplane server listening on http://localhost:${config.port}\\n`);\n });\n\n const shutdown = async (): Promise<void> => {\n await shutdownWorkflows();\n await pool.end();\n server.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => {\n void shutdown();\n });\n process.on(\"SIGTERM\", () => {\n void shutdown();\n });\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { Pool } from \"pg\";\n\nconst pools = new Map<string, Pool>();\n\nexport function getPool(databaseUrl: string): Pool {\n const existing = pools.get(databaseUrl);\n if (existing) {\n return existing;\n }\n\n const pool = new Pool({ connectionString: databaseUrl });\n pools.set(databaseUrl, pool);\n return pool;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n\n","import type { Pool, PoolClient } from \"pg\";\nimport { makeId } from \"../../core/src/ids.js\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n NodeRecord,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n TaskRecord,\n} from \"../../types/src/index.js\";\n\ninterface NodePollResult {\n run: RunRecord;\n task: TaskRecord;\n}\n\nfunction mapTask(row: Record<string, unknown>): TaskRecord {\n return {\n id: String(row.id),\n kind: String(row.kind),\n adapter: String(row.adapter),\n payload: (row.payload as Record<string, unknown>) ?? {},\n requires: (row.requires as string[]) ?? [],\n status: row.status as TaskRecord[\"status\"],\n createdAt: new Date(String(row.created_at)).toISOString(),\n updatedAt: new Date(String(row.updated_at)).toISOString(),\n };\n}\n\nfunction mapRun(row: Record<string, unknown>): RunRecord {\n return {\n id: String(row.id),\n taskId: String(row.task_id),\n nodeId: String(row.node_id),\n attempt: Number(row.attempt),\n status: row.status as RunRecord[\"status\"],\n startedAt: row.started_at ? new Date(String(row.started_at)).toISOString() : null,\n endedAt: row.ended_at ? new Date(String(row.ended_at)).toISOString() : null,\n error: row.error ? String(row.error) : null,\n };\n}\n\nfunction mapInputEvent(row: Record<string, unknown>): RunInputEvent {\n return {\n id: Number(row.id),\n runId: String(row.run_id),\n sequence: Number(row.sequence),\n kind: row.kind as RunInputEvent[\"kind\"],\n payload: (row.payload as Record<string, unknown>) ?? {},\n createdAt: new Date(String(row.created_at)).toISOString(),\n deliveredAt: row.delivered_at ? new Date(String(row.delivered_at)).toISOString() : null,\n };\n}\n\nfunction mapArtifact(row: Record<string, unknown>): ArtifactRecord {\n return {\n id: String(row.id),\n runId: String(row.run_id),\n type: String(row.type),\n name: String(row.name),\n path: String(row.path),\n metadata: (row.metadata as Record<string, unknown> | null) ?? null,\n createdAt: new Date(String(row.created_at)).toISOString(),\n };\n}\n\nexport class PgStore {\n constructor(private readonly pool: Pool) {}\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const taskId = makeId(\"task\");\n const result = await this.pool.query(\n `\n insert into tasks (id, kind, adapter, payload, requires, status)\n values ($1, $2, $3, $4::jsonb, $5::text[], 'queued')\n returning *\n `,\n [taskId, input.kind, input.adapter, JSON.stringify(input.payload), input.requires ?? []],\n );\n\n return mapTask(result.rows[0] as Record<string, unknown>);\n }\n\n async listTasks(status?: TaskRecord[\"status\"]): Promise<TaskRecord[]> {\n const result = status\n ? await this.pool.query(\"select * from tasks where status = $1 order by created_at desc limit 100\", [status])\n : await this.pool.query(\"select * from tasks order by created_at desc limit 100\");\n return result.rows.map((row: Record<string, unknown>) => mapTask(row));\n }\n\n async getTask(taskId: string): Promise<TaskRecord | null> {\n const result = await this.pool.query(\"select * from tasks where id = $1\", [taskId]);\n if (result.rowCount === 0) {\n return null;\n }\n\n return mapTask(result.rows[0] as Record<string, unknown>);\n }\n\n async listRuns(filters?: { taskId?: string; status?: RunRecord[\"status\"] }): Promise<RunRecord[]> {\n const taskId = filters?.taskId;\n const status = filters?.status;\n const result =\n taskId && status\n ? await this.pool.query(\"select * from runs where task_id = $1 and status = $2 order by created_at desc\", [\n taskId,\n status,\n ])\n : taskId\n ? await this.pool.query(\"select * from runs where task_id = $1 order by created_at desc\", [taskId])\n : status\n ? await this.pool.query(\"select * from runs where status = $1 order by created_at desc limit 100\", [status])\n : await this.pool.query(\"select * from runs order by created_at desc limit 100\");\n\n return result.rows.map((row: Record<string, unknown>) => mapRun(row));\n }\n\n async getRun(runId: string): Promise<RunRecord | null> {\n const result = await this.pool.query(\"select * from runs where id = $1\", [runId]);\n if (result.rowCount === 0) {\n return null;\n }\n\n return mapRun(result.rows[0] as Record<string, unknown>);\n }\n\n async registerNode(name: string, capabilities: string[], preferredId?: string): Promise<NodeRecord> {\n const existing = await this.pool.query(\"select * from nodes where name = $1\", [name]);\n if (existing.rowCount && existing.rowCount > 0) {\n const row = existing.rows[0] as Record<string, unknown>;\n const nodeId = String(row.id);\n const updated = await this.pool.query(\n `\n update nodes\n set capabilities = $2::text[], status = 'online', last_heartbeat_at = now(), updated_at = now()\n where id = $1\n returning *\n `,\n [nodeId, capabilities],\n );\n return this.mapNodeRecord(updated.rows[0] as Record<string, unknown>);\n }\n\n const nodeId = preferredId ?? makeId(\"node\");\n const result = await this.pool.query(\n `\n insert into nodes (id, name, capabilities, status, last_heartbeat_at)\n values ($1, $2, $3::text[], 'online', now())\n returning *\n `,\n [nodeId, name, capabilities],\n );\n\n return this.mapNodeRecord(result.rows[0] as Record<string, unknown>);\n }\n\n async getRunCancellationState(\n runId: string,\n ): Promise<{ runStatus: string; taskStatus: string } | null> {\n const result = await this.pool.query(\n `\n select r.status as run_status, t.status as task_status\n from runs r\n join tasks t on t.id = r.task_id\n where r.id = $1\n `,\n [runId],\n );\n if (result.rowCount === 0) {\n return null;\n }\n const row = result.rows[0] as Record<string, unknown>;\n return {\n runStatus: String(row.run_status),\n taskStatus: String(row.task_status),\n };\n }\n\n private mapNodeRecord(row: Record<string, unknown>): NodeRecord {\n return {\n id: String(row.id),\n name: String(row.name),\n capabilities: (row.capabilities as string[]) ?? [],\n status: row.status as NodeRecord[\"status\"],\n lastHeartbeatAt: row.last_heartbeat_at\n ? new Date(String(row.last_heartbeat_at)).toISOString()\n : null,\n };\n }\n\n async pollNode(nodeId: string, capabilities: string[]): Promise<NodePollResult | null> {\n const client = await this.pool.connect();\n try {\n await client.query(\"begin\");\n await this.touchNode(client, nodeId, capabilities);\n const taskResult = await client.query(\n `\n select *\n from tasks\n where status = 'queued'\n and requires <@ $1::text[]\n order by created_at asc\n limit 1\n for update skip locked\n `,\n [capabilities],\n );\n\n if (taskResult.rowCount === 0) {\n await client.query(\"commit\");\n return null;\n }\n\n const taskRow = taskResult.rows[0] as Record<string, unknown>;\n const taskId = String(taskRow.id);\n const runId = makeId(\"run\");\n const attemptResult = await client.query(\"select coalesce(max(attempt), 0) as max_attempt from runs where task_id = $1\", [\n taskId,\n ]);\n const attempt = Number(attemptResult.rows[0].max_attempt) + 1;\n\n const runResult = await client.query(\n `\n insert into runs (id, task_id, node_id, attempt, status, started_at)\n values ($1, $2, $3, $4, 'assigned', now())\n returning *\n `,\n [runId, taskId, nodeId, attempt],\n );\n\n await client.query(\"update tasks set status = 'assigned', updated_at = now() where id = $1\", [taskId]);\n\n await client.query(\"commit\");\n\n return {\n task: mapTask(taskRow),\n run: mapRun(runResult.rows[0] as Record<string, unknown>),\n };\n } catch (error) {\n await client.query(\"rollback\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n async updateRunStatus(runId: string, status: RunRecord[\"status\"], error?: string): Promise<RunRecord | null> {\n const client = await this.pool.connect();\n try {\n await client.query(\"begin\");\n const currentResult = await client.query(\n `\n select r.*, t.status as task_status\n from runs r\n join tasks t on t.id = r.task_id\n where r.id = $1\n for update\n `,\n [runId],\n );\n if (currentResult.rowCount === 0) {\n await client.query(\"rollback\");\n return null;\n }\n const currentRow = currentResult.rows[0] as Record<string, unknown>;\n const currentTaskStatus = String(currentRow.task_status);\n if (currentTaskStatus === \"cancelled\" && status !== \"cancelled\") {\n await client.query(\"commit\");\n return mapRun(currentRow);\n }\n\n const runResult = await client.query(\n `\n update runs\n set status = $2, error = $3, ended_at = case when $2 in ('succeeded', 'failed', 'cancelled') then now() else ended_at end, updated_at = now()\n where id = $1\n returning *\n `,\n [runId, status, error ?? null],\n );\n if (runResult.rowCount === 0) {\n await client.query(\"rollback\");\n return null;\n }\n\n const run = mapRun(runResult.rows[0] as Record<string, unknown>);\n const nextTaskStatus =\n status === \"succeeded\" || status === \"failed\" || status === \"cancelled\" ? status : \"running\";\n if (currentTaskStatus !== \"cancelled\" || status === \"cancelled\") {\n await client.query(\"update tasks set status = $2, updated_at = now() where id = $1\", [run.taskId, nextTaskStatus]);\n }\n await client.query(\"commit\");\n return run;\n } catch (error) {\n await client.query(\"rollback\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n let inserted = 0;\n for (const log of logs) {\n await this.pool.query(\n `\n insert into run_logs (run_id, step_name, stream, message)\n values ($1, $2, $3, $4)\n `,\n [runId, log.stepName ?? null, log.stream, log.message],\n );\n inserted += 1;\n }\n\n return inserted;\n }\n\n async getRunLogs(runId: string): Promise<Array<Record<string, unknown>>> {\n const result = await this.pool.query(\"select * from run_logs where run_id = $1 order by timestamp asc\", [runId]);\n return result.rows as Array<Record<string, unknown>>;\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const artifactId = makeId(\"artifact\");\n const result = await this.pool.query(\n `\n insert into artifacts (id, run_id, type, name, path, metadata)\n values ($1, $2, $3, $4, $5, $6::jsonb)\n returning *\n `,\n [artifactId, runId, input.type, input.name, input.path, input.metadata ? JSON.stringify(input.metadata) : null],\n );\n return mapArtifact(result.rows[0] as Record<string, unknown>);\n }\n\n async listRunArtifacts(runId: string): Promise<ArtifactRecord[]> {\n const result = await this.pool.query(\"select * from artifacts where run_id = $1 order by created_at asc\", [runId]);\n return result.rows.map((row: Record<string, unknown>) => mapArtifact(row));\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const result = await this.pool.query(\n `\n update tasks\n set status = 'queued', updated_at = now()\n where id = $1 and status = 'failed'\n returning *\n `,\n [taskId],\n );\n if (result.rowCount === 0) {\n return null;\n }\n\n return mapTask(result.rows[0] as Record<string, unknown>);\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n const client = await this.pool.connect();\n try {\n await client.query(\"begin\");\n const taskResult = await client.query(\"select * from tasks where id = $1 for update\", [taskId]);\n if (taskResult.rowCount === 0) {\n await client.query(\"rollback\");\n return null;\n }\n\n const taskRow = taskResult.rows[0] as Record<string, unknown>;\n const taskStatus = String(taskRow.status);\n if (taskStatus === \"succeeded\" || taskStatus === \"failed\" || taskStatus === \"cancelled\") {\n await client.query(\"rollback\");\n return null;\n }\n\n if (taskStatus === \"assigned\" || taskStatus === \"running\") {\n const runResult = await client.query(\n `\n select * from runs\n where task_id = $1\n order by attempt desc\n limit 1\n for update\n `,\n [taskId],\n );\n if (runResult.rowCount !== 0) {\n const runStatus = String(runResult.rows[0].status);\n if (runStatus !== \"succeeded\" && runStatus !== \"failed\" && runStatus !== \"cancelled\") {\n await client.query(\n `\n update runs\n set status = 'cancelled', ended_at = now(), updated_at = now(), error = coalesce(error, 'task cancelled')\n where id = $1\n `,\n [runResult.rows[0].id],\n );\n }\n }\n }\n\n const updateTaskResult = await client.query(\n `\n update tasks\n set status = 'cancelled', updated_at = now()\n where id = $1\n returning *\n `,\n [taskId],\n );\n\n await client.query(\"commit\");\n return mapTask(updateTaskResult.rows[0] as Record<string, unknown>);\n } catch (error) {\n await client.query(\"rollback\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n const client = await this.pool.connect();\n try {\n await client.query(\"begin\");\n const seqResult = await client.query(\n \"select coalesce(max(sequence), 0) + 1 as next_seq from run_input_events where run_id = $1\",\n [runId],\n );\n const sequence = Number(seqResult.rows[0].next_seq);\n const result = await client.query(\n `\n insert into run_input_events (run_id, sequence, kind, payload)\n values ($1, $2, $3, $4::jsonb)\n returning *\n `,\n [runId, sequence, input.kind, JSON.stringify(input.payload)],\n );\n await client.query(\"commit\");\n return mapInputEvent(result.rows[0] as Record<string, unknown>);\n } catch (error) {\n await client.query(\"rollback\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n async getInputEvents(runId: string, afterSequence: number): Promise<RunInputEvent[]> {\n const result = await this.pool.query(\n \"select * from run_input_events where run_id = $1 and sequence > $2 order by sequence asc\",\n [runId, afterSequence],\n );\n return result.rows.map((row: Record<string, unknown>) => mapInputEvent(row));\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n await this.pool.query(\n \"update run_input_events set delivered_at = now() where run_id = $1 and sequence = $2\",\n [runId, sequence],\n );\n }\n\n private async touchNode(client: PoolClient, nodeId: string, capabilities: string[]): Promise<void> {\n await client.query(\n `\n update nodes\n set capabilities = $2::text[], status = 'online', last_heartbeat_at = now(), updated_at = now()\n where id = $1\n `,\n [nodeId, capabilities],\n );\n }\n}\n","import type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n RunStatus,\n ServerWorkflows,\n TaskRecord,\n} from \"../../types/src/index.js\";\nimport { PgStore } from \"./store.js\";\n\nexport class VanillaWorkflows implements ServerWorkflows {\n constructor(private readonly store: PgStore) {}\n\n createTask(input: CreateTaskInput): Promise<TaskRecord> {\n return this.store.createTask(input);\n }\n\n retryTask(taskId: string): Promise<TaskRecord | null> {\n return this.store.retryTask(taskId);\n }\n\n cancelTask(taskId: string): Promise<TaskRecord | null> {\n return this.store.cancelTask(taskId);\n }\n\n updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null> {\n return this.store.updateRunStatus(runId, status, error);\n }\n\n appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n return this.store.appendRunLogs(runId, logs);\n }\n\n createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n return this.store.createArtifact(runId, input);\n }\n\n appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n return this.store.appendInputEvent(runId, input);\n }\n\n markInputDelivered(runId: string, sequence: number): Promise<void> {\n return this.store.markInputDelivered(runId, sequence);\n }\n}\n","import { z } from \"zod\";\nimport type { AppendInputEventInput, CreateTaskInput } from \"../../types/src/index.js\";\n\nconst repoFields = {\n repo: z.string().min(1).optional(),\n branch: z.string().min(1).optional(),\n};\n\nconst shellTaskSchema = z.object({\n kind: z.literal(\"shell.exec\"),\n adapter: z.literal(\"shell\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().min(1).optional(),\n ...repoFields,\n }),\n});\n\nconst aiderTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"aider\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n prompt: z.string().min(1),\n model: z.string().min(1).optional(),\n repo: z.string().min(1),\n branch: z.string().min(1).optional(),\n testCommand: z.string().min(1).optional(),\n }),\n});\n\nconst ollamaTaskSchema = z.object({\n kind: z.literal(\"inference.batch\"),\n adapter: z.literal(\"ollama\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n model: z.string().min(1),\n prompt: z.string().min(1),\n inputFile: z.string().min(1).optional(),\n }),\n});\n\nconst harnessPayloadSchema = z.object({\n prompt: z.string().min(1),\n model: z.string().min(1).optional(),\n repo: z.string().min(1),\n branch: z.string().min(1).optional(),\n testCommand: z.string().min(1).optional(),\n extraArgs: z.array(z.string()).optional(),\n interactive: z.boolean().optional(),\n});\n\nconst codexTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"codex\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: harnessPayloadSchema,\n});\n\nconst claudeCodeTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"claude-code\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: harnessPayloadSchema,\n});\n\nconst taskSchema = z.discriminatedUnion(\"adapter\", [\n shellTaskSchema,\n aiderTaskSchema,\n ollamaTaskSchema,\n codexTaskSchema,\n claudeCodeTaskSchema,\n]);\n\nexport function validateCreateTaskInput(input: unknown): CreateTaskInput {\n return taskSchema.parse(input);\n}\n\nconst inputEventSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"stdin\"),\n payload: z.object({ data: z.string() }),\n }),\n z.object({\n kind: z.literal(\"signal\"),\n payload: z.object({ signal: z.enum([\"SIGTERM\", \"SIGKILL\", \"SIGINT\"]) }),\n }),\n z.object({\n kind: z.literal(\"resize\"),\n payload: z.object({\n rows: z.number().int().positive(),\n cols: z.number().int().positive(),\n }),\n }),\n]);\n\nexport function validateInputEvent(input: unknown): AppendInputEventInput {\n return inputEventSchema.parse(input);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { getRequestBearer, isAuthorizedBearer } from \"../../core/src/auth.js\";\n\nexport type RouteAuth = \"public\" | \"node\" | \"operator\";\n\nexport interface AuthConfig {\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function checkRouteAuth(\n req: IncomingMessage,\n res: ServerResponse,\n auth: RouteAuth,\n config: AuthConfig,\n): boolean {\n const bearer = getRequestBearer(req);\n\n if (auth === \"public\") {\n return true;\n }\n\n if (auth === \"node\") {\n if (!isAuthorizedBearer(bearer, config.nodeToken)) {\n res.statusCode = 401;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"unauthorized node request\" }));\n return false;\n }\n return true;\n }\n\n if (auth === \"operator\") {\n if (!isAuthorizedBearer(bearer, config.operatorToken)) {\n res.statusCode = 401;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"unauthorized operator request\" }));\n return false;\n }\n return true;\n }\n\n return true;\n}\n\nexport function routeAuthFor(method: string, pathname: string): RouteAuth {\n if (pathname === \"/healthz\") {\n return \"public\";\n }\n\n if (method === \"POST\" && pathname === \"/nodes/register\") {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/nodes\\/[^/]+\\/poll$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/status$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/logs$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"GET\" && /^\\/runs\\/[^/]+\\/input$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/input\\/\\d+\\/delivered$/.test(pathname)) {\n return \"node\";\n }\n\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/input$/.test(pathname)) {\n return \"operator\";\n }\n\n if (method === \"POST\" && pathname === \"/tasks\") {\n return \"operator\";\n }\n if (method === \"POST\" && /^\\/tasks\\/[^/]+\\/retry$/.test(pathname)) {\n return \"operator\";\n }\n if (method === \"POST\" && /^\\/tasks\\/[^/]+\\/cancel$/.test(pathname)) {\n return \"operator\";\n }\n\n return \"public\";\n}\n\nexport function requiresConfiguredToken(auth: RouteAuth, config: AuthConfig): boolean {\n if (auth === \"node\") {\n return Boolean(config.nodeToken);\n }\n if (auth === \"operator\") {\n return Boolean(config.operatorToken);\n }\n return false;\n}\n"],"mappings":"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","names":["nodeId","error","z","createDbosWorkflows"]}
|
|
1
|
+
{"version":3,"sources":["../../dbos/src/index.ts","../../server/src/index.ts","../../core/src/config.ts","../../core/src/env.ts","../../db/src/client.ts","../../db/src/pg-store.ts","../../core/src/ids.ts","../../db/src/schema/pg.ts","../../db/src/sqlite-store.ts","../../db/src/schema/sqlite.ts","../../server/src/workflows-vanilla.ts","../../server/src/validation.ts","../../core/src/auth.ts","../../server/src/auth-middleware.ts"],"sourcesContent":["import { DBOS } from \"@dbos-inc/dbos-sdk\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n RunStatus,\n ServerWorkflows,\n TaskRecord,\n} from \"@workplane/types\";\n\nexport class DbosWorkflows implements ServerWorkflows {\n private readonly registered: ServerWorkflows;\n\n constructor(store: ServerWorkflows) {\n const createTask = DBOS.registerWorkflow(\n async (input: CreateTaskInput) =>\n DBOS.runStep(() => store.createTask(input), { name: \"store-create-task\" }),\n { name: \"createTaskWorkflow\" },\n );\n\n const retryTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.retryTask(taskId), { name: \"store-retry-task\" }),\n { name: \"retryTaskWorkflow\" },\n );\n\n const cancelTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.cancelTask(taskId), { name: \"store-cancel-task\" }),\n { name: \"cancelTaskWorkflow\" },\n );\n\n const updateRunStatus = DBOS.registerWorkflow(\n async (runId: string, status: RunStatus, error?: string) =>\n DBOS.runStep(() => store.updateRunStatus(runId, status, error), { name: \"store-update-run-status\" }),\n { name: \"updateRunStatusWorkflow\" },\n );\n\n const appendRunLogs = DBOS.registerWorkflow(\n async (runId: string, logs: RunLogInput[]) =>\n DBOS.runStep(() => store.appendRunLogs(runId, logs), { name: \"store-append-run-logs\" }),\n { name: \"appendRunLogsWorkflow\" },\n );\n\n const createArtifact = DBOS.registerWorkflow(\n async (runId: string, input: ArtifactInput) =>\n DBOS.runStep(() => store.createArtifact(runId, input), { name: \"store-create-artifact\" }),\n { name: \"createArtifactWorkflow\" },\n );\n\n const appendInputEvent = DBOS.registerWorkflow(\n async (runId: string, input: AppendInputEventInput) =>\n DBOS.runStep(() => store.appendInputEvent(runId, input), { name: \"store-append-input-event\" }),\n { name: \"appendInputEventWorkflow\" },\n );\n\n const markInputDelivered = DBOS.registerWorkflow(\n async (runId: string, sequence: number) =>\n DBOS.runStep(() => store.markInputDelivered(runId, sequence), { name: \"store-mark-input-delivered\" }),\n { name: \"markInputDeliveredWorkflow\" },\n );\n\n this.registered = {\n createTask,\n retryTask,\n cancelTask,\n updateRunStatus,\n appendRunLogs,\n createArtifact,\n appendInputEvent,\n markInputDelivered,\n };\n }\n\n async launch(options: {\n appName: string;\n systemDatabaseUrl: string;\n conductorKey?: string;\n conductorUrl?: string;\n }): Promise<void> {\n DBOS.setConfig({\n name: options.appName,\n systemDatabaseUrl: options.systemDatabaseUrl,\n });\n await DBOS.launch({\n conductorKey: options.conductorKey,\n conductorURL: options.conductorUrl,\n });\n }\n\n async shutdown(): Promise<void> {\n await DBOS.shutdown();\n }\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createTask)(input);\n return handle.getResult();\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.retryTask)(taskId);\n return handle.getResult();\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.cancelTask)(taskId);\n return handle.getResult();\n }\n\n async updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.updateRunStatus)(runId, status, error);\n return handle.getResult();\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n const handle = await DBOS.startWorkflow(this.registered.appendRunLogs)(runId, logs);\n return handle.getResult();\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createArtifact)(runId, input);\n return handle.getResult();\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n const handle = await DBOS.startWorkflow(this.registered.appendInputEvent)(runId, input);\n return handle.getResult();\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n const handle = await DBOS.startWorkflow(this.registered.markInputDelivered)(runId, sequence);\n await handle.getResult();\n }\n}\n\nexport function createDbosWorkflows(store: ServerWorkflows): DbosWorkflows {\n return new DbosWorkflows(store);\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { URL } from \"node:url\";\nimport { ZodError } from \"zod\";\nimport { loadServerConfig } from \"../../core/src/config.js\";\nimport { createStore } from \"../../db/src/client.js\";\nimport type { WorkplaneStore } from \"../../db/src/store-interface.js\";\nimport type { AppendInputEventInput, ArtifactInput, CreateTaskInput, RunLogInput, RunStatus, ServerWorkflows } from \"../../types/src/index.js\";\nimport { VanillaWorkflows } from \"./workflows-vanilla.js\";\nimport { validateCreateTaskInput, validateInputEvent } from \"./validation.js\";\nimport { checkRouteAuth, requiresConfiguredToken, routeAuthFor } from \"./auth-middleware.js\";\n\nconst taskStatuses = new Set<RunStatus>([\"queued\", \"assigned\", \"running\", \"succeeded\", \"failed\", \"cancelled\"]);\n\nfunction parseStatus(value: string | null): RunStatus | undefined {\n if (!value) {\n return undefined;\n }\n if (!taskStatuses.has(value as RunStatus)) {\n throw new Error(`invalid status filter: ${value}`);\n }\n return value as RunStatus;\n}\n\nasync function readJson<T>(req: IncomingMessage): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const body = Buffer.concat(chunks).toString(\"utf8\");\n return (body ? JSON.parse(body) : {}) as T;\n}\n\nfunction writeJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n const json = JSON.stringify(payload);\n res.statusCode = statusCode;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(json);\n}\n\nasync function buildWorkflows(store: WorkplaneStore, config: { databaseUrl: string }): Promise<{\n workflows: ServerWorkflows;\n shutdown: () => Promise<void>;\n}> {\n if (process.env.WORKPLANE_USE_DBOS === \"true\") {\n const { createDbosWorkflows } = await import(\"../../dbos/src/index.js\");\n const dbos = createDbosWorkflows(store);\n await dbos.launch({\n appName: process.env.DBOS_APPLICATION_NAME ?? \"workplane-server\",\n systemDatabaseUrl: config.databaseUrl,\n conductorKey: process.env.DBOS_CONDUCTOR_KEY,\n conductorUrl: process.env.DBOS_CONDUCTOR_URL,\n });\n return { workflows: dbos, shutdown: () => dbos.shutdown() };\n }\n\n return { workflows: new VanillaWorkflows(store), shutdown: async () => {} };\n}\n\nasync function main(): Promise<void> {\n const config = loadServerConfig();\n const { store, close: closeStore } = createStore(config.databaseUrl);\n const { workflows, shutdown: shutdownWorkflows } = await buildWorkflows(store, config);\n\n const server = createServer(async (req, res) => {\n try {\n if (!req.url || !req.method) {\n writeJson(res, 400, { error: \"invalid request\" });\n return;\n }\n\n const url = new URL(req.url, \"http://localhost\");\n const routeAuth = routeAuthFor(req.method, url.pathname);\n const authConfig = { nodeToken: config.nodeToken, operatorToken: config.operatorToken };\n if (requiresConfiguredToken(routeAuth, authConfig) && !checkRouteAuth(req, res, routeAuth, authConfig)) {\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/healthz\") {\n writeJson(res, 200, { ok: true });\n return;\n }\n\n if (req.method === \"POST\" && url.pathname === \"/tasks\") {\n const body = await readJson<CreateTaskInput>(req);\n const validated = validateCreateTaskInput(body);\n const task = await workflows.createTask({\n kind: validated.kind,\n adapter: validated.adapter,\n payload: validated.payload,\n requires: validated.requires ?? [],\n });\n writeJson(res, 201, task);\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/tasks\") {\n const status = parseStatus(url.searchParams.get(\"status\"));\n const tasks = await store.listTasks(status);\n writeJson(res, 200, { tasks });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/tasks\\/[^/]+$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await store.getTask(taskId);\n if (!task) {\n writeJson(res, 404, { error: \"task not found\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/tasks\\/[^/]+\\/retry$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await workflows.retryTask(taskId);\n if (!task) {\n writeJson(res, 409, { error: \"task is not retryable\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/tasks\\/[^/]+\\/cancel$/.test(url.pathname)) {\n const taskId = url.pathname.split(\"/\")[2];\n const task = await workflows.cancelTask(taskId);\n if (!task) {\n writeJson(res, 409, { error: \"task is not cancellable\" });\n return;\n }\n writeJson(res, 200, task);\n return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/runs\") {\n const taskId = url.searchParams.get(\"taskId\") ?? undefined;\n const status = parseStatus(url.searchParams.get(\"status\"));\n const runs = await store.listRuns({ taskId, status });\n writeJson(res, 200, { runs });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const run = await store.getRun(runId);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n writeJson(res, 200, run);\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/logs$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const logs = await store.getRunLogs(runId);\n writeJson(res, 200, { logs });\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const artifacts = await store.listRunArtifacts(runId);\n writeJson(res, 200, { artifacts });\n return;\n }\n\n if (req.method === \"POST\" && url.pathname === \"/nodes/register\") {\n const body = await readJson<{ name: string; capabilities: string[]; nodeId?: string }>(req);\n const node = await store.registerNode(body.name, body.capabilities ?? [], body.nodeId);\n writeJson(res, 201, node);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/nodes\\/[^/]+\\/poll$/.test(url.pathname)) {\n const nodeId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ capabilities: string[] }>(req);\n const assignment = await store.pollNode(nodeId, body.capabilities ?? []);\n writeJson(res, 200, { assignment });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/status$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ status: RunStatus; error?: string }>(req);\n const run = await workflows.updateRunStatus(runId, body.status, body.error);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n writeJson(res, 200, run);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/logs$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<{ logs: RunLogInput[] }>(req);\n const inserted = await workflows.appendRunLogs(runId, body.logs ?? []);\n writeJson(res, 200, { inserted });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const body = await readJson<ArtifactInput>(req);\n const artifact = await workflows.createArtifact(runId, body);\n writeJson(res, 201, artifact);\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/input$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const run = await store.getRun(runId);\n if (!run) {\n writeJson(res, 404, { error: \"run not found\" });\n return;\n }\n if (run.status !== \"running\") {\n writeJson(res, 409, { error: \"run is not active\" });\n return;\n }\n const body = await readJson<AppendInputEventInput>(req);\n const validated = validateInputEvent(body);\n const event = await workflows.appendInputEvent(runId, validated);\n writeJson(res, 201, event);\n return;\n }\n\n if (req.method === \"GET\" && /^\\/runs\\/[^/]+\\/input$/.test(url.pathname)) {\n const runId = url.pathname.split(\"/\")[2];\n const afterSequence = Number(url.searchParams.get(\"afterSequence\") ?? \"0\");\n const events = await store.getInputEvents(runId, afterSequence);\n writeJson(res, 200, { events });\n return;\n }\n\n if (req.method === \"POST\" && /^\\/runs\\/[^/]+\\/input\\/\\d+\\/delivered$/.test(url.pathname)) {\n const parts = url.pathname.split(\"/\");\n const runId = parts[2];\n const sequence = Number(parts[4]);\n await workflows.markInputDelivered(runId, sequence);\n writeJson(res, 200, { ok: true });\n return;\n }\n\n writeJson(res, 404, { error: \"not found\" });\n } catch (error) {\n if (error instanceof ZodError) {\n writeJson(res, 400, { error: \"invalid task payload\", details: error });\n return;\n }\n if (error instanceof Error && error.message.startsWith(\"invalid status filter:\")) {\n writeJson(res, 400, { error: error.message });\n return;\n }\n const message = error instanceof Error ? error.message : \"internal error\";\n writeJson(res, 500, { error: message });\n }\n });\n\n server.listen(config.port, () => {\n process.stdout.write(`workplane server listening on http://localhost:${config.port}\\n`);\n });\n\n const shutdown = async (): Promise<void> => {\n await shutdownWorkflows();\n await closeStore();\n server.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => {\n void shutdown();\n });\n process.on(\"SIGTERM\", () => {\n void shutdown();\n });\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().optional().default(\"sqlite://~/.workplane/workplane.db\"),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nlet envLoaded = false;\n\n// Load order (highest priority first, all with override:false so shell env vars win):\n// 1. .env.local — project-local overrides (gitignored)\n// 2. ~/.workplane/.env — user global config written by workplane-setup\n// 3. .env — project defaults (committed)\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env.local\" });\n dotenvConfig({ path: join(homedir(), \".workplane\", \".env\") });\n dotenvConfig({ path: \".env\" });\n\n envLoaded = true;\n}\n","import { mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { drizzle as drizzlePg } from \"drizzle-orm/node-postgres\";\nimport type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { drizzle as drizzleSqlite } from \"drizzle-orm/better-sqlite3\";\nimport Database from \"better-sqlite3\";\nimport { Pool } from \"pg\";\nimport { PgStore } from \"./pg-store.js\";\nimport { SqliteStore } from \"./sqlite-store.js\";\nimport * as pgSchema from \"./schema/pg.js\";\nimport * as sqliteSchema from \"./schema/sqlite.js\";\nimport type { WorkplaneStore } from \"./store-interface.js\";\n\nexport type DrizzleDb = NodePgDatabase<typeof pgSchema>;\n\nexport interface StoreHandle {\n store: WorkplaneStore;\n close: () => Promise<void>;\n}\n\nconst pools = new Map<string, Pool>();\n\nexport function getPool(databaseUrl: string): Pool {\n const existing = pools.get(databaseUrl);\n if (existing) return existing;\n const pool = new Pool({ connectionString: databaseUrl });\n pools.set(databaseUrl, pool);\n return pool;\n}\n\nexport function getDrizzle(pool: Pool): DrizzleDb {\n return drizzlePg(pool, { schema: pgSchema });\n}\n\nfunction parseSqlitePath(url: string): string {\n const path = url.startsWith(\"sqlite://\") ? url.slice(\"sqlite://\".length) : url;\n if (!path) return join(homedir(), \".workplane\", \"workplane.db\");\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n return path;\n}\n\nexport function createStore(databaseUrl?: string): StoreHandle {\n const url = databaseUrl ?? \"\";\n\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n const pool = getPool(url);\n return {\n store: new PgStore(getDrizzle(pool)),\n close: () => pool.end(),\n };\n }\n\n const filePath = parseSqlitePath(url);\n mkdirSync(dirname(filePath), { recursive: true });\n const sqlite = new Database(filePath);\n sqlite.pragma(\"journal_mode = WAL\");\n sqlite.pragma(\"synchronous = NORMAL\");\n const db = drizzleSqlite(sqlite, { schema: sqliteSchema });\n return {\n store: new SqliteStore(db),\n close: async () => { sqlite.close(); },\n };\n}\n","import { and, asc, desc, eq, gt, sql } from \"drizzle-orm\";\nimport { makeId } from \"../../core/src/ids.js\";\nimport type { DrizzleDb } from \"./client.js\";\nimport { artifacts, nodes, runInputEvents, runLogs, runs, tasks } from \"./schema/pg.js\";\nimport type { WorkplaneStore } from \"./store-interface.js\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n NodePollResult,\n NodeRecord,\n RunInputEvent,\n RunLogInput,\n RunLogRecord,\n RunRecord,\n TaskRecord,\n} from \"../../types/src/index.js\";\n\nfunction toTaskRecord(row: typeof tasks.$inferSelect): TaskRecord {\n return {\n id: row.id,\n kind: row.kind,\n adapter: row.adapter,\n payload: row.payload,\n requires: row.requires ?? [],\n status: row.status as TaskRecord[\"status\"],\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nfunction toRunRecord(row: typeof runs.$inferSelect): RunRecord {\n return {\n id: row.id,\n taskId: row.taskId,\n nodeId: row.nodeId,\n attempt: row.attempt,\n status: row.status as RunRecord[\"status\"],\n startedAt: row.startedAt?.toISOString() ?? null,\n endedAt: row.endedAt?.toISOString() ?? null,\n error: row.error ?? null,\n };\n}\n\nfunction toNodeRecord(row: typeof nodes.$inferSelect): NodeRecord {\n return {\n id: row.id,\n name: row.name,\n capabilities: row.capabilities ?? [],\n status: row.status as NodeRecord[\"status\"],\n lastHeartbeatAt: row.lastHeartbeatAt?.toISOString() ?? null,\n };\n}\n\nfunction toLogRecord(row: typeof runLogs.$inferSelect): RunLogRecord {\n return {\n id: row.id,\n runId: row.runId,\n stepName: row.stepName ?? null,\n stream: row.stream as RunLogRecord[\"stream\"],\n message: row.message,\n timestamp: row.timestamp.toISOString(),\n };\n}\n\nfunction toArtifactRecord(row: typeof artifacts.$inferSelect): ArtifactRecord {\n return {\n id: row.id,\n runId: row.runId,\n type: row.type,\n name: row.name,\n path: row.path,\n metadata: row.metadata ?? null,\n createdAt: row.createdAt.toISOString(),\n };\n}\n\nfunction toInputEventRecord(row: typeof runInputEvents.$inferSelect): RunInputEvent {\n return {\n id: row.id,\n runId: row.runId,\n sequence: row.sequence,\n kind: row.kind as RunInputEvent[\"kind\"],\n payload: row.payload,\n createdAt: row.createdAt.toISOString(),\n deliveredAt: row.deliveredAt?.toISOString() ?? null,\n };\n}\n\nfunction mapRawTask(row: Record<string, unknown>): TaskRecord {\n return {\n id: String(row.id),\n kind: String(row.kind),\n adapter: String(row.adapter),\n payload: (row.payload as Record<string, unknown>) ?? {},\n requires: (row.requires as string[]) ?? [],\n status: row.status as TaskRecord[\"status\"],\n createdAt: new Date(String(row.created_at)).toISOString(),\n updatedAt: new Date(String(row.updated_at)).toISOString(),\n };\n}\n\nfunction mapRawRun(row: Record<string, unknown>): RunRecord {\n return {\n id: String(row.id),\n taskId: String(row.task_id),\n nodeId: String(row.node_id),\n attempt: Number(row.attempt),\n status: row.status as RunRecord[\"status\"],\n startedAt: row.started_at ? new Date(String(row.started_at)).toISOString() : null,\n endedAt: row.ended_at ? new Date(String(row.ended_at)).toISOString() : null,\n error: row.error ? String(row.error) : null,\n };\n}\n\nexport class PgStore implements WorkplaneStore {\n constructor(private readonly db: DrizzleDb) {}\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const taskId = makeId(\"task\");\n const [row] = await this.db.insert(tasks).values({\n id: taskId,\n kind: input.kind,\n adapter: input.adapter,\n payload: input.payload,\n requires: input.requires ?? [],\n status: \"queued\",\n }).returning();\n return toTaskRecord(row);\n }\n\n async listTasks(status?: TaskRecord[\"status\"]): Promise<TaskRecord[]> {\n const rows = await this.db\n .select()\n .from(tasks)\n .where(status ? eq(tasks.status, status) : undefined)\n .orderBy(desc(tasks.createdAt))\n .limit(100);\n return rows.map(toTaskRecord);\n }\n\n async getTask(taskId: string): Promise<TaskRecord | null> {\n const [row] = await this.db.select().from(tasks).where(eq(tasks.id, taskId));\n return row ? toTaskRecord(row) : null;\n }\n\n async listRuns(filters?: { taskId?: string; status?: RunRecord[\"status\"] }): Promise<RunRecord[]> {\n const conditions = [];\n if (filters?.taskId) conditions.push(eq(runs.taskId, filters.taskId));\n if (filters?.status) conditions.push(eq(runs.status, filters.status));\n\n const rows = await this.db\n .select()\n .from(runs)\n .where(conditions.length ? and(...conditions) : undefined)\n .orderBy(desc(runs.createdAt))\n .limit(100);\n return rows.map(toRunRecord);\n }\n\n async getRun(runId: string): Promise<RunRecord | null> {\n const [row] = await this.db.select().from(runs).where(eq(runs.id, runId));\n return row ? toRunRecord(row) : null;\n }\n\n async registerNode(name: string, capabilities: string[], preferredId?: string): Promise<NodeRecord> {\n const [existing] = await this.db.select().from(nodes).where(eq(nodes.name, name));\n\n if (existing) {\n const [updated] = await this.db.update(nodes)\n .set({ capabilities, status: \"online\", lastHeartbeatAt: sql`now()`, updatedAt: sql`now()` })\n .where(eq(nodes.id, existing.id))\n .returning();\n return toNodeRecord(updated);\n }\n\n const nodeId = preferredId ?? makeId(\"node\");\n const [inserted] = await this.db.insert(nodes).values({\n id: nodeId, name, capabilities, status: \"online\", lastHeartbeatAt: sql`now()`,\n }).returning();\n return toNodeRecord(inserted);\n }\n\n async getRunCancellationState(runId: string): Promise<{ runStatus: string; taskStatus: string } | null> {\n const [row] = await this.db\n .select({ runStatus: runs.status, taskStatus: tasks.status })\n .from(runs)\n .innerJoin(tasks, eq(tasks.id, runs.taskId))\n .where(eq(runs.id, runId));\n return row ?? null;\n }\n\n async pollNode(nodeId: string, capabilities: string[]): Promise<NodePollResult | null> {\n return await this.db.transaction(async (tx) => {\n await tx.execute(sql`\n UPDATE nodes\n SET capabilities = ${capabilities}::text[], status = 'online',\n last_heartbeat_at = now(), updated_at = now()\n WHERE id = ${nodeId}\n `);\n\n const taskResult = await tx.execute(sql`\n SELECT * FROM tasks\n WHERE status = 'queued' AND requires <@ ${capabilities}::text[]\n ORDER BY created_at ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED\n `);\n\n if (taskResult.rows.length === 0) return null;\n\n const taskRow = taskResult.rows[0] as Record<string, unknown>;\n const taskId = String(taskRow.id);\n\n const attemptResult = await tx.execute(sql`\n SELECT COALESCE(MAX(attempt), 0) AS max_attempt FROM runs WHERE task_id = ${taskId}\n `);\n const attempt = Number((attemptResult.rows[0] as Record<string, unknown>).max_attempt) + 1;\n\n const runId = makeId(\"run\");\n\n const runResult = await tx.execute(sql`\n INSERT INTO runs (id, task_id, node_id, attempt, status, started_at)\n VALUES (${runId}, ${taskId}, ${nodeId}, ${attempt}, 'assigned', now())\n RETURNING *\n `);\n\n await tx.execute(sql`\n UPDATE tasks SET status = 'assigned', updated_at = now() WHERE id = ${taskId}\n `);\n\n return {\n task: mapRawTask(taskRow),\n run: mapRawRun(runResult.rows[0] as Record<string, unknown>),\n };\n });\n }\n\n async updateRunStatus(runId: string, status: RunRecord[\"status\"], error?: string): Promise<RunRecord | null> {\n return await this.db.transaction(async (tx) => {\n const currentResult = await tx.execute(sql`\n SELECT r.*, t.status AS task_status\n FROM runs r JOIN tasks t ON t.id = r.task_id\n WHERE r.id = ${runId}\n FOR UPDATE\n `);\n\n if (currentResult.rows.length === 0) return null;\n\n const currentRow = currentResult.rows[0] as Record<string, unknown>;\n const currentTaskStatus = String(currentRow.task_status);\n\n if (currentTaskStatus === \"cancelled\" && status !== \"cancelled\") {\n return mapRawRun(currentRow);\n }\n\n const isTerminal = status === \"succeeded\" || status === \"failed\" || status === \"cancelled\";\n const [updatedRun] = await tx.update(runs)\n .set(isTerminal\n ? { status, error: error ?? null, endedAt: sql`now()`, updatedAt: sql`now()` }\n : { status, error: error ?? null, updatedAt: sql`now()` })\n .where(eq(runs.id, runId))\n .returning();\n\n if (!updatedRun) return null;\n\n const nextTaskStatus = isTerminal ? status : \"running\";\n if (currentTaskStatus !== \"cancelled\" || status === \"cancelled\") {\n await tx.update(tasks)\n .set({ status: nextTaskStatus, updatedAt: sql`now()` })\n .where(eq(tasks.id, updatedRun.taskId));\n }\n\n return toRunRecord(updatedRun);\n });\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n if (logs.length === 0) return 0;\n await this.db.insert(runLogs).values(\n logs.map((log) => ({\n runId,\n stepName: log.stepName ?? null,\n stream: log.stream,\n message: log.message,\n })),\n );\n return logs.length;\n }\n\n async getRunLogs(runId: string): Promise<RunLogRecord[]> {\n const rows = await this.db\n .select()\n .from(runLogs)\n .where(eq(runLogs.runId, runId))\n .orderBy(asc(runLogs.timestamp));\n return rows.map(toLogRecord);\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const artifactId = makeId(\"artifact\");\n const [row] = await this.db.insert(artifacts).values({\n id: artifactId,\n runId,\n type: input.type,\n name: input.name,\n path: input.path,\n metadata: input.metadata ?? null,\n }).returning();\n return toArtifactRecord(row);\n }\n\n async listRunArtifacts(runId: string): Promise<ArtifactRecord[]> {\n const rows = await this.db\n .select()\n .from(artifacts)\n .where(eq(artifacts.runId, runId))\n .orderBy(asc(artifacts.createdAt));\n return rows.map(toArtifactRecord);\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const [row] = await this.db.update(tasks)\n .set({ status: \"queued\", updatedAt: sql`now()` })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, \"failed\")))\n .returning();\n return row ? toTaskRecord(row) : null;\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n return await this.db.transaction(async (tx) => {\n const taskResult = await tx.execute(sql`\n SELECT * FROM tasks WHERE id = ${taskId} FOR UPDATE\n `);\n\n if (taskResult.rows.length === 0) return null;\n\n const taskRow = taskResult.rows[0] as Record<string, unknown>;\n const taskStatus = String(taskRow.status);\n\n if (taskStatus === \"succeeded\" || taskStatus === \"failed\" || taskStatus === \"cancelled\") {\n return null;\n }\n\n if (taskStatus === \"assigned\" || taskStatus === \"running\") {\n const runResult = await tx.execute(sql`\n SELECT * FROM runs WHERE task_id = ${taskId} ORDER BY attempt DESC LIMIT 1 FOR UPDATE\n `);\n\n if (runResult.rows.length > 0) {\n const runRow = runResult.rows[0] as Record<string, unknown>;\n const runStatus = String(runRow.status);\n if (runStatus !== \"succeeded\" && runStatus !== \"failed\" && runStatus !== \"cancelled\") {\n await tx.execute(sql`\n UPDATE runs SET status = 'cancelled', ended_at = now(), updated_at = now(),\n error = COALESCE(error, 'task cancelled')\n WHERE id = ${runRow.id}\n `);\n }\n }\n }\n\n const [updatedTask] = await tx.update(tasks)\n .set({ status: \"cancelled\", updatedAt: sql`now()` })\n .where(eq(tasks.id, taskId))\n .returning();\n\n return toTaskRecord(updatedTask);\n });\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n return await this.db.transaction(async (tx) => {\n const seqResult = await tx.execute(sql`\n SELECT COALESCE(MAX(sequence), 0) + 1 AS next_seq FROM run_input_events WHERE run_id = ${runId}\n `);\n const sequence = Number((seqResult.rows[0] as Record<string, unknown>).next_seq);\n\n const [inserted] = await tx.insert(runInputEvents)\n .values({ runId, sequence, kind: input.kind, payload: input.payload })\n .returning();\n\n return toInputEventRecord(inserted);\n });\n }\n\n async getInputEvents(runId: string, afterSequence: number): Promise<RunInputEvent[]> {\n const rows = await this.db\n .select()\n .from(runInputEvents)\n .where(and(eq(runInputEvents.runId, runId), gt(runInputEvents.sequence, afterSequence)))\n .orderBy(asc(runInputEvents.sequence));\n return rows.map(toInputEventRecord);\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n await this.db.update(runInputEvents)\n .set({ deliveredAt: sql`now()` })\n .where(and(eq(runInputEvents.runId, runId), eq(runInputEvents.sequence, sequence)));\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n\n","import { isNull, sql } from \"drizzle-orm\";\nimport { bigint, bigserial, index, integer, jsonb, pgTable, text, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\n\nexport const tasks = pgTable(\"tasks\", {\n id: text(\"id\").primaryKey(),\n kind: text(\"kind\").notNull(),\n adapter: text(\"adapter\").notNull(),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n requires: text(\"requires\").array().notNull().default(sql`'{}'::text[]`),\n status: text(\"status\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => ({\n statusCreatedAtIdx: index(\"idx_tasks_status_created_at\").on(table.status, table.createdAt),\n}));\n\nexport const nodes = pgTable(\"nodes\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n capabilities: text(\"capabilities\").array().notNull().default(sql`'{}'::text[]`),\n status: text(\"status\").notNull().default(\"online\"),\n lastHeartbeatAt: timestamp(\"last_heartbeat_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const runs = pgTable(\"runs\", {\n id: text(\"id\").primaryKey(),\n taskId: text(\"task_id\").notNull().references(() => tasks.id),\n nodeId: text(\"node_id\").notNull().references(() => nodes.id),\n attempt: integer(\"attempt\").notNull(),\n status: text(\"status\").notNull(),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n endedAt: timestamp(\"ended_at\", { withTimezone: true }),\n error: text(\"error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => ({\n taskIdIdx: index(\"idx_runs_task_id\").on(table.taskId),\n nodeIdIdx: index(\"idx_runs_node_id\").on(table.nodeId),\n}));\n\nexport const runLogs = pgTable(\"run_logs\", {\n id: bigserial(\"id\", { mode: \"number\" }).primaryKey(),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n stepName: text(\"step_name\"),\n stream: text(\"stream\").notNull(),\n message: text(\"message\").notNull(),\n timestamp: timestamp(\"timestamp\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => ({\n runIdTimestampIdx: index(\"idx_run_logs_run_id_timestamp\").on(table.runId, table.timestamp),\n}));\n\nexport const artifacts = pgTable(\"artifacts\", {\n id: text(\"id\").primaryKey(),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n type: text(\"type\").notNull(),\n name: text(\"name\").notNull(),\n path: text(\"path\").notNull(),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => ({\n runIdIdx: index(\"idx_artifacts_run_id\").on(table.runId),\n}));\n\nexport const runInputEvents = pgTable(\"run_input_events\", {\n id: bigserial(\"id\", { mode: \"number\" }).primaryKey(),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n sequence: bigint(\"sequence\", { mode: \"number\" }).notNull(),\n kind: text(\"kind\").notNull(),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n deliveredAt: timestamp(\"delivered_at\", { withTimezone: true }),\n}, (table) => ({\n runSequenceUniqueIdx: uniqueIndex(\"idx_run_input_events_run_sequence\").on(table.runId, table.sequence),\n undeliveredIdx: index(\"idx_run_input_events_undelivered\").on(table.runId, table.sequence).where(isNull(table.deliveredAt)),\n}));\n","import { and, asc, desc, eq, gt, sql } from \"drizzle-orm\";\nimport type { BetterSQLite3Database } from \"drizzle-orm/better-sqlite3\";\nimport { makeId } from \"../../core/src/ids.js\";\nimport { artifacts, nodes, runInputEvents, runLogs, runs, tasks } from \"./schema/sqlite.js\";\nimport type * as sqliteSchema from \"./schema/sqlite.js\";\nimport type { WorkplaneStore } from \"./store-interface.js\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n NodePollResult,\n NodeRecord,\n RunInputEvent,\n RunLogInput,\n RunLogRecord,\n RunRecord,\n TaskRecord,\n} from \"../../types/src/index.js\";\n\ntype SqliteDb = BetterSQLite3Database<typeof sqliteSchema>;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n// Drizzle-typed mappers for simple CRUD methods (camelCase, text timestamps)\n\nfunction toTaskRecord(row: typeof tasks.$inferSelect): TaskRecord {\n return {\n id: row.id,\n kind: row.kind,\n adapter: row.adapter,\n payload: row.payload,\n requires: row.requires ?? [],\n status: row.status as TaskRecord[\"status\"],\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n\nfunction toRunRecord(row: typeof runs.$inferSelect): RunRecord {\n return {\n id: row.id,\n taskId: row.taskId,\n nodeId: row.nodeId,\n attempt: row.attempt,\n status: row.status as RunRecord[\"status\"],\n startedAt: row.startedAt ?? null,\n endedAt: row.endedAt ?? null,\n error: row.error ?? null,\n };\n}\n\nfunction toNodeRecord(row: typeof nodes.$inferSelect): NodeRecord {\n return {\n id: row.id,\n name: row.name,\n capabilities: row.capabilities ?? [],\n status: row.status as NodeRecord[\"status\"],\n lastHeartbeatAt: row.lastHeartbeatAt ?? null,\n };\n}\n\nfunction toLogRecord(row: typeof runLogs.$inferSelect): RunLogRecord {\n return {\n id: row.id,\n runId: row.runId,\n stepName: row.stepName ?? null,\n stream: row.stream as RunLogRecord[\"stream\"],\n message: row.message,\n timestamp: row.timestamp,\n };\n}\n\nfunction toArtifactRecord(row: typeof artifacts.$inferSelect): ArtifactRecord {\n return {\n id: row.id,\n runId: row.runId,\n type: row.type,\n name: row.name,\n path: row.path,\n metadata: row.metadata ?? null,\n createdAt: row.createdAt,\n };\n}\n\nfunction toInputEventRecord(row: typeof runInputEvents.$inferSelect): RunInputEvent {\n return {\n id: row.id,\n runId: row.runId,\n sequence: row.sequence,\n kind: row.kind as RunInputEvent[\"kind\"],\n payload: row.payload,\n createdAt: row.createdAt,\n deliveredAt: row.deliveredAt ?? null,\n };\n}\n\n// Raw-row mappers for transaction methods that use $client directly.\n// better-sqlite3 rejects async transaction callbacks so we use the sync\n// $client API with prepared statements for the 4 methods that need atomicity.\n\ninterface RawTaskRow {\n id: string; kind: string; adapter: string;\n payload: string; requires: string; status: string;\n created_at: string; updated_at: string;\n}\n\ninterface RawRunRow {\n id: string; task_id: string; node_id: string; attempt: number; status: string;\n started_at: string | null; ended_at: string | null; error: string | null;\n created_at: string; updated_at: string;\n}\n\nfunction mapRawTask(row: RawTaskRow): TaskRecord {\n return {\n id: row.id, kind: row.kind, adapter: row.adapter,\n payload: JSON.parse(row.payload) as Record<string, unknown>,\n requires: JSON.parse(row.requires) as string[],\n status: row.status as TaskRecord[\"status\"],\n createdAt: row.created_at, updatedAt: row.updated_at,\n };\n}\n\nfunction mapRawRun(row: RawRunRow): RunRecord {\n return {\n id: row.id, taskId: row.task_id, nodeId: row.node_id,\n attempt: row.attempt, status: row.status as RunRecord[\"status\"],\n startedAt: row.started_at ?? null, endedAt: row.ended_at ?? null,\n error: row.error ?? null,\n };\n}\n\nexport class SqliteStore implements WorkplaneStore {\n constructor(private readonly db: SqliteDb) {}\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const now = nowIso();\n const [row] = await this.db.insert(tasks).values({\n id: makeId(\"task\"),\n kind: input.kind,\n adapter: input.adapter,\n payload: input.payload,\n requires: input.requires ?? [],\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n }).returning();\n return toTaskRecord(row);\n }\n\n async listTasks(status?: TaskRecord[\"status\"]): Promise<TaskRecord[]> {\n const rows = await this.db.select().from(tasks)\n .where(status ? eq(tasks.status, status) : undefined)\n .orderBy(desc(tasks.createdAt)).limit(100);\n return rows.map(toTaskRecord);\n }\n\n async getTask(taskId: string): Promise<TaskRecord | null> {\n const [row] = await this.db.select().from(tasks).where(eq(tasks.id, taskId));\n return row ? toTaskRecord(row) : null;\n }\n\n async listRuns(filters?: { taskId?: string; status?: RunRecord[\"status\"] }): Promise<RunRecord[]> {\n const conds = [];\n if (filters?.taskId) conds.push(eq(runs.taskId, filters.taskId));\n if (filters?.status) conds.push(eq(runs.status, filters.status));\n const rows = await this.db.select().from(runs)\n .where(conds.length ? and(...conds) : undefined)\n .orderBy(desc(runs.createdAt)).limit(100);\n return rows.map(toRunRecord);\n }\n\n async getRun(runId: string): Promise<RunRecord | null> {\n const [row] = await this.db.select().from(runs).where(eq(runs.id, runId));\n return row ? toRunRecord(row) : null;\n }\n\n async registerNode(name: string, capabilities: string[], preferredId?: string): Promise<NodeRecord> {\n const now = nowIso();\n const [existing] = await this.db.select().from(nodes).where(eq(nodes.name, name));\n if (existing) {\n const [updated] = await this.db.update(nodes)\n .set({ capabilities, status: \"online\", lastHeartbeatAt: now, updatedAt: now })\n .where(eq(nodes.id, existing.id)).returning();\n return toNodeRecord(updated);\n }\n const [inserted] = await this.db.insert(nodes).values({\n id: preferredId ?? makeId(\"node\"), name, capabilities,\n status: \"online\", lastHeartbeatAt: now, createdAt: now, updatedAt: now,\n }).returning();\n return toNodeRecord(inserted);\n }\n\n async getRunCancellationState(runId: string): Promise<{ runStatus: string; taskStatus: string } | null> {\n const [row] = await this.db\n .select({ runStatus: runs.status, taskStatus: tasks.status })\n .from(runs).innerJoin(tasks, eq(tasks.id, runs.taskId)).where(eq(runs.id, runId));\n return row ? { runStatus: row.runStatus, taskStatus: row.taskStatus ?? \"\" } : null;\n }\n\n // Transaction methods use this.db.$client directly because better-sqlite3\n // rejects async callbacks — all operations inside must be synchronous.\n\n async pollNode(nodeId: string, capabilities: string[]): Promise<NodePollResult | null> {\n const now = nowIso();\n await this.db.update(nodes)\n .set({ capabilities, status: \"online\", lastHeartbeatAt: now, updatedAt: now })\n .where(eq(nodes.id, nodeId));\n\n const raw = this.db.$client;\n return raw.transaction(() => {\n const capSet = new Set(capabilities);\n const queued = raw.prepare(\n \"SELECT * FROM tasks WHERE status = 'queued' ORDER BY created_at ASC\",\n ).all() as RawTaskRow[];\n\n const task = queued.find((t) =>\n (JSON.parse(t.requires) as string[]).every((r) => capSet.has(r)),\n );\n if (!task) return null;\n\n const { max_attempt } = raw.prepare(\n \"SELECT COALESCE(MAX(attempt), 0) AS max_attempt FROM runs WHERE task_id = ?\",\n ).get(task.id) as { max_attempt: number };\n\n const runId = makeId(\"run\");\n raw.prepare(\n \"INSERT INTO runs (id, task_id, node_id, attempt, status, started_at, created_at, updated_at) VALUES (?, ?, ?, ?, 'assigned', ?, ?, ?)\",\n ).run(runId, task.id, nodeId, max_attempt + 1, now, now, now);\n\n raw.prepare(\"UPDATE tasks SET status = 'assigned', updated_at = ? WHERE id = ?\").run(now, task.id);\n\n return {\n task: mapRawTask(task),\n run: mapRawRun(raw.prepare(\"SELECT * FROM runs WHERE id = ?\").get(runId) as RawRunRow),\n };\n })();\n }\n\n async updateRunStatus(runId: string, status: RunRecord[\"status\"], error?: string): Promise<RunRecord | null> {\n const raw = this.db.$client;\n return raw.transaction(() => {\n const current = raw.prepare(\n \"SELECT r.*, t.status AS task_status FROM runs r JOIN tasks t ON t.id = r.task_id WHERE r.id = ?\",\n ).get(runId) as (RawRunRow & { task_status: string }) | undefined;\n if (!current) return null;\n\n if (current.task_status === \"cancelled\" && status !== \"cancelled\") {\n return mapRawRun(current);\n }\n\n const now = nowIso();\n const isTerminal = status === \"succeeded\" || status === \"failed\" || status === \"cancelled\";\n if (isTerminal) {\n raw.prepare(\n \"UPDATE runs SET status = ?, error = ?, ended_at = ?, updated_at = ? WHERE id = ?\",\n ).run(status, error ?? null, now, now, runId);\n } else {\n raw.prepare(\n \"UPDATE runs SET status = ?, error = ?, updated_at = ? WHERE id = ?\",\n ).run(status, error ?? null, now, runId);\n }\n\n const updatedRun = raw.prepare(\"SELECT * FROM runs WHERE id = ?\").get(runId) as RawRunRow;\n const nextTaskStatus = isTerminal ? status : \"running\";\n if (current.task_status !== \"cancelled\" || status === \"cancelled\") {\n raw.prepare(\"UPDATE tasks SET status = ?, updated_at = ? WHERE id = ?\").run(\n nextTaskStatus, now, updatedRun.task_id,\n );\n }\n return mapRawRun(updatedRun);\n })();\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n if (logs.length === 0) return 0;\n const now = nowIso();\n await this.db.insert(runLogs).values(\n logs.map((log) => ({\n runId, stepName: log.stepName ?? null,\n stream: log.stream, message: log.message, timestamp: now,\n })),\n );\n return logs.length;\n }\n\n async getRunLogs(runId: string): Promise<RunLogRecord[]> {\n const rows = await this.db.select().from(runLogs)\n .where(eq(runLogs.runId, runId)).orderBy(asc(runLogs.timestamp));\n return rows.map(toLogRecord);\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const now = nowIso();\n const [row] = await this.db.insert(artifacts).values({\n id: makeId(\"artifact\"), runId, type: input.type, name: input.name,\n path: input.path, metadata: input.metadata ?? null, createdAt: now,\n }).returning();\n return toArtifactRecord(row);\n }\n\n async listRunArtifacts(runId: string): Promise<ArtifactRecord[]> {\n const rows = await this.db.select().from(artifacts)\n .where(eq(artifacts.runId, runId)).orderBy(asc(artifacts.createdAt));\n return rows.map(toArtifactRecord);\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const [row] = await this.db.update(tasks)\n .set({ status: \"queued\", updatedAt: nowIso() })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, \"failed\"))).returning();\n return row ? toTaskRecord(row) : null;\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n const raw = this.db.$client;\n return raw.transaction(() => {\n const taskRow = raw.prepare(\"SELECT * FROM tasks WHERE id = ?\").get(taskId) as RawTaskRow | undefined;\n if (!taskRow) return null;\n\n const terminal = new Set([\"succeeded\", \"failed\", \"cancelled\"]);\n if (terminal.has(taskRow.status)) return null;\n\n const now = nowIso();\n if (taskRow.status === \"assigned\" || taskRow.status === \"running\") {\n const latestRun = raw.prepare(\n \"SELECT * FROM runs WHERE task_id = ? ORDER BY attempt DESC LIMIT 1\",\n ).get(taskId) as RawRunRow | undefined;\n\n if (latestRun && !terminal.has(latestRun.status)) {\n raw.prepare(\n \"UPDATE runs SET status = 'cancelled', ended_at = ?, updated_at = ?, error = COALESCE(error, 'task cancelled') WHERE id = ?\",\n ).run(now, now, latestRun.id);\n }\n }\n\n raw.prepare(\"UPDATE tasks SET status = 'cancelled', updated_at = ? WHERE id = ?\").run(now, taskId);\n return mapRawTask(raw.prepare(\"SELECT * FROM tasks WHERE id = ?\").get(taskId) as RawTaskRow);\n })();\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n const raw = this.db.$client;\n const now = nowIso();\n const event = raw.transaction(() => {\n const { next_seq } = raw.prepare(\n \"SELECT COALESCE(MAX(sequence), 0) + 1 AS next_seq FROM run_input_events WHERE run_id = ?\",\n ).get(runId) as { next_seq: number };\n\n raw.prepare(\n \"INSERT INTO run_input_events (run_id, sequence, kind, payload, created_at) VALUES (?, ?, ?, ?, ?)\",\n ).run(runId, next_seq, input.kind, JSON.stringify(input.payload), now);\n\n return raw.prepare(\n \"SELECT * FROM run_input_events WHERE run_id = ? AND sequence = ?\",\n ).get(runId, next_seq) as {\n id: number; run_id: string; sequence: number; kind: string;\n payload: string; created_at: string; delivered_at: string | null;\n };\n })();\n\n return {\n id: event.id, runId: event.run_id, sequence: event.sequence,\n kind: event.kind as RunInputEvent[\"kind\"],\n payload: JSON.parse(event.payload) as Record<string, unknown>,\n createdAt: event.created_at, deliveredAt: event.delivered_at ?? null,\n };\n }\n\n async getInputEvents(runId: string, afterSequence: number): Promise<RunInputEvent[]> {\n const rows = await this.db.select().from(runInputEvents)\n .where(and(eq(runInputEvents.runId, runId), gt(runInputEvents.sequence, afterSequence)))\n .orderBy(asc(runInputEvents.sequence));\n return rows.map(toInputEventRecord);\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n await this.db.update(runInputEvents)\n .set({ deliveredAt: nowIso() })\n .where(and(eq(runInputEvents.runId, runId), eq(runInputEvents.sequence, sequence)));\n }\n}\n","import { isNull, sql } from \"drizzle-orm\";\nimport { index, integer, sqliteTable, text, uniqueIndex } from \"drizzle-orm/sqlite-core\";\n\nconst nowDefault = sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`;\n\nexport const tasks = sqliteTable(\"tasks\", {\n id: text(\"id\").primaryKey(),\n kind: text(\"kind\").notNull(),\n adapter: text(\"adapter\").notNull(),\n payload: text(\"payload\", { mode: \"json\" }).$type<Record<string, unknown>>().notNull().default({}),\n requires: text(\"requires\", { mode: \"json\" }).$type<string[]>().notNull().default([]),\n status: text(\"status\").notNull(),\n createdAt: text(\"created_at\").notNull().default(nowDefault),\n updatedAt: text(\"updated_at\").notNull().default(nowDefault),\n}, (table) => ({\n statusCreatedAtIdx: index(\"idx_tasks_status_created_at\").on(table.status, table.createdAt),\n}));\n\nexport const nodes = sqliteTable(\"nodes\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n capabilities: text(\"capabilities\", { mode: \"json\" }).$type<string[]>().notNull().default([]),\n status: text(\"status\").notNull().default(\"online\"),\n lastHeartbeatAt: text(\"last_heartbeat_at\"),\n createdAt: text(\"created_at\").notNull().default(nowDefault),\n updatedAt: text(\"updated_at\").notNull().default(nowDefault),\n});\n\nexport const runs = sqliteTable(\"runs\", {\n id: text(\"id\").primaryKey(),\n taskId: text(\"task_id\").notNull().references(() => tasks.id),\n nodeId: text(\"node_id\").notNull().references(() => nodes.id),\n attempt: integer(\"attempt\").notNull(),\n status: text(\"status\").notNull(),\n startedAt: text(\"started_at\"),\n endedAt: text(\"ended_at\"),\n error: text(\"error\"),\n createdAt: text(\"created_at\").notNull().default(nowDefault),\n updatedAt: text(\"updated_at\").notNull().default(nowDefault),\n}, (table) => ({\n taskIdIdx: index(\"idx_runs_task_id\").on(table.taskId),\n nodeIdIdx: index(\"idx_runs_node_id\").on(table.nodeId),\n}));\n\nexport const runLogs = sqliteTable(\"run_logs\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n stepName: text(\"step_name\"),\n stream: text(\"stream\").notNull(),\n message: text(\"message\").notNull(),\n timestamp: text(\"timestamp\").notNull().default(nowDefault),\n}, (table) => ({\n runIdTimestampIdx: index(\"idx_run_logs_run_id_timestamp\").on(table.runId, table.timestamp),\n}));\n\nexport const artifacts = sqliteTable(\"artifacts\", {\n id: text(\"id\").primaryKey(),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n type: text(\"type\").notNull(),\n name: text(\"name\").notNull(),\n path: text(\"path\").notNull(),\n metadata: text(\"metadata\", { mode: \"json\" }).$type<Record<string, unknown>>(),\n createdAt: text(\"created_at\").notNull().default(nowDefault),\n}, (table) => ({\n runIdIdx: index(\"idx_artifacts_run_id\").on(table.runId),\n}));\n\nexport const runInputEvents = sqliteTable(\"run_input_events\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n runId: text(\"run_id\").notNull().references(() => runs.id),\n sequence: integer(\"sequence\").notNull(),\n kind: text(\"kind\").notNull(),\n payload: text(\"payload\", { mode: \"json\" }).$type<Record<string, unknown>>().notNull().default({}),\n createdAt: text(\"created_at\").notNull().default(nowDefault),\n deliveredAt: text(\"delivered_at\"),\n}, (table) => ({\n runSequenceUniqueIdx: uniqueIndex(\"idx_run_input_events_run_sequence\").on(table.runId, table.sequence),\n undeliveredIdx: index(\"idx_run_input_events_undelivered\").on(table.runId, table.sequence).where(isNull(table.deliveredAt)),\n}));\n","import type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n RunStatus,\n ServerWorkflows,\n TaskRecord,\n} from \"../../types/src/index.js\";\nimport type { WorkplaneStore } from \"../../db/src/store-interface.js\";\n\nexport class VanillaWorkflows implements ServerWorkflows {\n constructor(private readonly store: WorkplaneStore) {}\n\n createTask(input: CreateTaskInput): Promise<TaskRecord> {\n return this.store.createTask(input);\n }\n\n retryTask(taskId: string): Promise<TaskRecord | null> {\n return this.store.retryTask(taskId);\n }\n\n cancelTask(taskId: string): Promise<TaskRecord | null> {\n return this.store.cancelTask(taskId);\n }\n\n updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null> {\n return this.store.updateRunStatus(runId, status, error);\n }\n\n appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n return this.store.appendRunLogs(runId, logs);\n }\n\n createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n return this.store.createArtifact(runId, input);\n }\n\n appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n return this.store.appendInputEvent(runId, input);\n }\n\n markInputDelivered(runId: string, sequence: number): Promise<void> {\n return this.store.markInputDelivered(runId, sequence);\n }\n}\n","import { z } from \"zod\";\nimport type { AppendInputEventInput, CreateTaskInput } from \"../../types/src/index.js\";\n\nconst repoFields = {\n repo: z.string().min(1).optional(),\n branch: z.string().min(1).optional(),\n};\n\nconst shellTaskSchema = z.object({\n kind: z.literal(\"shell.exec\"),\n adapter: z.literal(\"shell\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().min(1).optional(),\n ...repoFields,\n }),\n});\n\nconst aiderTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"aider\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n prompt: z.string().min(1),\n model: z.string().min(1).optional(),\n repo: z.string().min(1),\n branch: z.string().min(1).optional(),\n testCommand: z.string().min(1).optional(),\n }),\n});\n\nconst ollamaTaskSchema = z.object({\n kind: z.literal(\"inference.batch\"),\n adapter: z.literal(\"ollama\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: z.object({\n model: z.string().min(1),\n prompt: z.string().min(1),\n inputFile: z.string().min(1).optional(),\n }),\n});\n\nconst harnessPayloadSchema = z.object({\n prompt: z.string().min(1),\n model: z.string().min(1).optional(),\n repo: z.string().min(1),\n branch: z.string().min(1).optional(),\n testCommand: z.string().min(1).optional(),\n extraArgs: z.array(z.string()).optional(),\n interactive: z.boolean().optional(),\n});\n\nconst codexTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"codex\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: harnessPayloadSchema,\n});\n\nconst claudeCodeTaskSchema = z.object({\n kind: z.literal(\"agent.run\"),\n adapter: z.literal(\"claude-code\"),\n requires: z.array(z.string().min(1)).optional(),\n payload: harnessPayloadSchema,\n});\n\nconst taskSchema = z.discriminatedUnion(\"adapter\", [\n shellTaskSchema,\n aiderTaskSchema,\n ollamaTaskSchema,\n codexTaskSchema,\n claudeCodeTaskSchema,\n]);\n\nexport function validateCreateTaskInput(input: unknown): CreateTaskInput {\n return taskSchema.parse(input);\n}\n\nconst inputEventSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"stdin\"),\n payload: z.object({ data: z.string() }),\n }),\n z.object({\n kind: z.literal(\"signal\"),\n payload: z.object({ signal: z.enum([\"SIGTERM\", \"SIGKILL\", \"SIGINT\"]) }),\n }),\n z.object({\n kind: z.literal(\"resize\"),\n payload: z.object({\n rows: z.number().int().positive(),\n cols: z.number().int().positive(),\n }),\n }),\n]);\n\nexport function validateInputEvent(input: unknown): AppendInputEventInput {\n return inputEventSchema.parse(input);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { getRequestBearer, isAuthorizedBearer } from \"../../core/src/auth.js\";\n\nexport type RouteAuth = \"public\" | \"node\" | \"operator\";\n\nexport interface AuthConfig {\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function checkRouteAuth(\n req: IncomingMessage,\n res: ServerResponse,\n auth: RouteAuth,\n config: AuthConfig,\n): boolean {\n const bearer = getRequestBearer(req);\n\n if (auth === \"public\") {\n return true;\n }\n\n if (auth === \"node\") {\n if (!isAuthorizedBearer(bearer, config.nodeToken)) {\n res.statusCode = 401;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"unauthorized node request\" }));\n return false;\n }\n return true;\n }\n\n if (auth === \"operator\") {\n if (!isAuthorizedBearer(bearer, config.operatorToken)) {\n res.statusCode = 401;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"unauthorized operator request\" }));\n return false;\n }\n return true;\n }\n\n return true;\n}\n\nexport function routeAuthFor(method: string, pathname: string): RouteAuth {\n if (pathname === \"/healthz\") {\n return \"public\";\n }\n\n if (method === \"POST\" && pathname === \"/nodes/register\") {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/nodes\\/[^/]+\\/poll$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/status$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/logs$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/artifacts$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"GET\" && /^\\/runs\\/[^/]+\\/input$/.test(pathname)) {\n return \"node\";\n }\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/input\\/\\d+\\/delivered$/.test(pathname)) {\n return \"node\";\n }\n\n if (method === \"POST\" && /^\\/runs\\/[^/]+\\/input$/.test(pathname)) {\n return \"operator\";\n }\n\n if (method === \"POST\" && pathname === \"/tasks\") {\n return \"operator\";\n }\n if (method === \"POST\" && /^\\/tasks\\/[^/]+\\/retry$/.test(pathname)) {\n return \"operator\";\n }\n if (method === \"POST\" && /^\\/tasks\\/[^/]+\\/cancel$/.test(pathname)) {\n return \"operator\";\n }\n\n return \"public\";\n}\n\nexport function requiresConfiguredToken(auth: RouteAuth, config: AuthConfig): boolean {\n if (auth === \"node\") {\n return Boolean(config.nodeToken);\n }\n if (auth === \"operator\") {\n return Boolean(config.operatorToken);\n }\n return false;\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAY;AA2Id,SAAS,oBAAoB,OAAuC;AACzE,SAAO,IAAI,cAAc,KAAK;AAChC;AA7IA,IAca;AAdb;AAAA;AAAA;AAcO,IAAM,gBAAN,MAA+C;AAAA,MACnC;AAAA,MAEjB,YAAY,OAAwB;AAClC,cAAM,aAAa,KAAK;AAAA,UACtB,OAAO,UACL,KAAK,QAAQ,MAAM,MAAM,WAAW,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAAA,UAC3E,EAAE,MAAM,qBAAqB;AAAA,QAC/B;AAEA,cAAM,YAAY,KAAK;AAAA,UACrB,OAAO,WACL,KAAK,QAAQ,MAAM,MAAM,UAAU,MAAM,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAAA,UAC1E,EAAE,MAAM,oBAAoB;AAAA,QAC9B;AAEA,cAAM,aAAa,KAAK;AAAA,UACtB,OAAO,WACL,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAAA,UAC5E,EAAE,MAAM,qBAAqB;AAAA,QAC/B;AAEA,cAAM,kBAAkB,KAAK;AAAA,UAC3B,OAAO,OAAe,QAAmB,UACvC,KAAK,QAAQ,MAAM,MAAM,gBAAgB,OAAO,QAAQ,KAAK,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAAA,UACrG,EAAE,MAAM,0BAA0B;AAAA,QACpC;AAEA,cAAM,gBAAgB,KAAK;AAAA,UACzB,OAAO,OAAe,SACpB,KAAK,QAAQ,MAAM,MAAM,cAAc,OAAO,IAAI,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAAA,UACxF,EAAE,MAAM,wBAAwB;AAAA,QAClC;AAEA,cAAM,iBAAiB,KAAK;AAAA,UAC1B,OAAO,OAAe,UACpB,KAAK,QAAQ,MAAM,MAAM,eAAe,OAAO,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAAA,UAC1F,EAAE,MAAM,yBAAyB;AAAA,QACnC;AAEA,cAAM,mBAAmB,KAAK;AAAA,UAC5B,OAAO,OAAe,UACpB,KAAK,QAAQ,MAAM,MAAM,iBAAiB,OAAO,KAAK,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAAA,UAC/F,EAAE,MAAM,2BAA2B;AAAA,QACrC;AAEA,cAAM,qBAAqB,KAAK;AAAA,UAC9B,OAAO,OAAe,aACpB,KAAK,QAAQ,MAAM,MAAM,mBAAmB,OAAO,QAAQ,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAAA,UACtG,EAAE,MAAM,6BAA6B;AAAA,QACvC;AAEA,aAAK,aAAa;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,SAKK;AAChB,aAAK,UAAU;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,mBAAmB,QAAQ;AAAA,QAC7B,CAAC;AACD,cAAM,KAAK,OAAO;AAAA,UAChB,cAAc,QAAQ;AAAA,UACtB,cAAc,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,WAA0B;AAC9B,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,MAEA,MAAM,WAAW,OAA6C;AAC5D,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,UAAU,EAAE,KAAK;AACzE,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,UAAU,QAA4C;AAC1D,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,SAAS,EAAE,MAAM;AACzE,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,WAAW,QAA4C;AAC3D,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,UAAU,EAAE,MAAM;AAC1E,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,gBAAgB,OAAe,QAAmB,OAA2C;AACjG,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,eAAe,EAAE,OAAO,QAAQ,KAAK;AAC7F,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,cAAc,OAAe,MAAsC;AACvE,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,aAAa,EAAE,OAAO,IAAI;AAClF,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,eAAe,OAAe,OAA+C;AACjF,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,cAAc,EAAE,OAAO,KAAK;AACpF,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,iBAAiB,OAAe,OAAsD;AAC1F,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,gBAAgB,EAAE,OAAO,KAAK;AACtF,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,MAAM,mBAAmB,OAAe,UAAiC;AACvE,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,WAAW,kBAAkB,EAAE,OAAO,QAAQ;AAC3F,cAAM,OAAO,UAAU;AAAA,MACzB;AAAA,IACF;AAAA;AAAA;;;ACzIA,SAAS,oBAA+D;AACxE,SAAS,WAAW;AACpB,SAAS,gBAAgB;;;ACFzB,SAAS,SAAS;;;ACAlB,SAAS,UAAU,oBAAoB;AACvC,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAI,YAAY;AAMT,SAAS,eAAqB;AACnC,MAAI,WAAW;AACb;AAAA,EACF;AAEA,eAAa,EAAE,MAAM,aAAa,CAAC;AACnC,eAAa,EAAE,MAAM,KAAK,QAAQ,GAAG,cAAc,MAAM,EAAE,CAAC;AAC5D,eAAa,EAAE,MAAM,OAAO,CAAC;AAE7B,cAAY;AACd;;;ADjBA,aAAa;AAEb,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,oCAAoC;AAAA,EAChF,uBAAuB,EACpB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAED,IAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACjF,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,cAAc;AAAA,EACjE,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,6BAA6B,EAC1B,OAAO,EACP,SAAS,EACT,QAAQ,0DAA0D;AAAA,EACrE,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAoBM,SAAS,iBAAiB,MAAyB,QAAQ,KAAmB;AACnF,QAAM,SAAS,gBAAgB,MAAM,GAAG;AAExC,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,cAAc,SAAS,OAAO,2BAA2B,EAAE;AAAA,EAC7D;AACF;AAgBO,SAAS,SAAS,OAAyB;AAChD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACnB;;;AEnFA,SAAS,iBAAiB;AAC1B,SAAS,WAAAA,gBAAe;AACxB,SAAS,SAAS,QAAAC,aAAY;AAC9B,SAAS,WAAW,iBAAiB;AAErC,SAAS,WAAW,qBAAqB;AACzC,OAAO,cAAc;AACrB,SAAS,YAAY;;;ACPrB,SAAS,KAAK,KAAK,MAAM,IAAI,IAAI,OAAAC,YAAW;;;ACA5C,SAAS,kBAAkB;AAEpB,SAAS,OAAO,QAAwB;AAC7C,SAAO,GAAG,MAAM,IAAI,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,QAAQ,WAAW;AAC5B,SAAS,QAAQ,WAAW,OAAO,SAAS,OAAO,SAAS,MAAM,WAAW,mBAAmB;AAEzF,IAAM,QAAQ,QAAQ,SAAS;AAAA,EACpC,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,SAAS,MAAM,SAAS,EAAE,MAA+B,EAAE,QAAQ;AAAA,EACnE,UAAU,KAAK,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,iBAAiB;AAAA,EACtE,QAAQ,KAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAClF,GAAG,CAAC,WAAW;AAAA,EACb,oBAAoB,MAAM,6BAA6B,EAAE,GAAG,MAAM,QAAQ,MAAM,SAAS;AAC3F,EAAE;AAEK,IAAM,QAAQ,QAAQ,SAAS;AAAA,EACpC,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,cAAc,KAAK,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,iBAAiB;AAAA,EAC9E,QAAQ,KAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,QAAQ;AAAA,EACjD,iBAAiB,UAAU,qBAAqB,EAAE,cAAc,KAAK,CAAC;AAAA,EACtE,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAClF,CAAC;AAEM,IAAM,OAAO,QAAQ,QAAQ;AAAA,EAClC,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,QAAQ,KAAK,SAAS,EAAE,QAAQ,EAAE,WAAW,MAAM,MAAM,EAAE;AAAA,EAC3D,QAAQ,KAAK,SAAS,EAAE,QAAQ,EAAE,WAAW,MAAM,MAAM,EAAE;AAAA,EAC3D,SAAS,QAAQ,SAAS,EAAE,QAAQ;AAAA,EACpC,QAAQ,KAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC;AAAA,EACzD,SAAS,UAAU,YAAY,EAAE,cAAc,KAAK,CAAC;AAAA,EACrD,OAAO,KAAK,OAAO;AAAA,EACnB,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAClF,GAAG,CAAC,WAAW;AAAA,EACb,WAAW,MAAM,kBAAkB,EAAE,GAAG,MAAM,MAAM;AAAA,EACpD,WAAW,MAAM,kBAAkB,EAAE,GAAG,MAAM,MAAM;AACtD,EAAE;AAEK,IAAM,UAAU,QAAQ,YAAY;AAAA,EACzC,IAAI,UAAU,MAAM,EAAE,MAAM,SAAS,CAAC,EAAE,WAAW;AAAA,EACnD,OAAO,KAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAM,KAAK,EAAE;AAAA,EACxD,UAAU,KAAK,WAAW;AAAA,EAC1B,QAAQ,KAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,WAAW,UAAU,aAAa,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACjF,GAAG,CAAC,WAAW;AAAA,EACb,mBAAmB,MAAM,+BAA+B,EAAE,GAAG,MAAM,OAAO,MAAM,SAAS;AAC3F,EAAE;AAEK,IAAM,YAAY,QAAQ,aAAa;AAAA,EAC5C,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,OAAO,KAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAM,KAAK,EAAE;AAAA,EACxD,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,UAAU,MAAM,UAAU,EAAE,MAA+B;AAAA,EAC3D,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAClF,GAAG,CAAC,WAAW;AAAA,EACb,UAAU,MAAM,sBAAsB,EAAE,GAAG,MAAM,KAAK;AACxD,EAAE;AAEK,IAAM,iBAAiB,QAAQ,oBAAoB;AAAA,EACxD,IAAI,UAAU,MAAM,EAAE,MAAM,SAAS,CAAC,EAAE,WAAW;AAAA,EACnD,OAAO,KAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAM,KAAK,EAAE;AAAA,EACxD,UAAU,OAAO,YAAY,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EACzD,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,SAAS,MAAM,SAAS,EAAE,MAA+B,EAAE,QAAQ;AAAA,EACnE,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,aAAa,UAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC;AAC/D,GAAG,CAAC,WAAW;AAAA,EACb,sBAAsB,YAAY,mCAAmC,EAAE,GAAG,MAAM,OAAO,MAAM,QAAQ;AAAA,EACrG,gBAAgB,MAAM,kCAAkC,EAAE,GAAG,MAAM,OAAO,MAAM,QAAQ,EAAE,MAAM,OAAO,MAAM,WAAW,CAAC;AAC3H,EAAE;;;AFzDF,SAAS,aAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,SAAS,IAAI;AAAA,IACb,UAAU,IAAI,YAAY,CAAC;AAAA,IAC3B,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI,UAAU,YAAY;AAAA,IACrC,WAAW,IAAI,UAAU,YAAY;AAAA,EACvC;AACF;AAEA,SAAS,YAAY,KAA0C;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI,WAAW,YAAY,KAAK;AAAA,IAC3C,SAAS,IAAI,SAAS,YAAY,KAAK;AAAA,IACvC,OAAO,IAAI,SAAS;AAAA,EACtB;AACF;AAEA,SAAS,aAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,cAAc,IAAI,gBAAgB,CAAC;AAAA,IACnC,QAAQ,IAAI;AAAA,IACZ,iBAAiB,IAAI,iBAAiB,YAAY,KAAK;AAAA,EACzD;AACF;AAEA,SAAS,YAAY,KAAgD;AACnE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,UAAU,IAAI,YAAY;AAAA,IAC1B,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,WAAW,IAAI,UAAU,YAAY;AAAA,EACvC;AACF;AAEA,SAAS,iBAAiB,KAAoD;AAC5E,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,UAAU,IAAI,YAAY;AAAA,IAC1B,WAAW,IAAI,UAAU,YAAY;AAAA,EACvC;AACF;AAEA,SAAS,mBAAmB,KAAwD;AAClF,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,WAAW,IAAI,UAAU,YAAY;AAAA,IACrC,aAAa,IAAI,aAAa,YAAY,KAAK;AAAA,EACjD;AACF;AAEA,SAAS,WAAW,KAA0C;AAC5D,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,MAAM,OAAO,IAAI,IAAI;AAAA,IACrB,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,SAAU,IAAI,WAAuC,CAAC;AAAA,IACtD,UAAW,IAAI,YAAyB,CAAC;AAAA,IACzC,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY;AAAA,IACxD,WAAW,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY;AAAA,EAC1D;AACF;AAEA,SAAS,UAAU,KAAyC;AAC1D,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,QAAQ,OAAO,IAAI,OAAO;AAAA,IAC1B,QAAQ,OAAO,IAAI,OAAO;AAAA,IAC1B,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI,aAAa,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY,IAAI;AAAA,IAC7E,SAAS,IAAI,WAAW,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,EAAE,YAAY,IAAI;AAAA,IACvE,OAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,IAAI;AAAA,EACzC;AACF;AAEO,IAAM,UAAN,MAAwC;AAAA,EAC7C,YAA6B,IAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA,EAE7B,MAAM,WAAW,OAA6C;AAC5D,UAAM,SAAS,OAAO,MAAM;AAC5B,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,KAAK,EAAE,OAAO;AAAA,MAC/C,IAAI;AAAA,MACJ,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,UAAU,MAAM,YAAY,CAAC;AAAA,MAC7B,QAAQ;AAAA,IACV,CAAC,EAAE,UAAU;AACb,WAAO,aAAa,GAAG;AAAA,EACzB;AAAA,EAEA,MAAM,UAAU,QAAsD;AACpE,UAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,KAAK,EACV,MAAM,SAAS,GAAG,MAAM,QAAQ,MAAM,IAAI,MAAS,EACnD,QAAQ,KAAK,MAAM,SAAS,CAAC,EAC7B,MAAM,GAAG;AACZ,WAAO,KAAK,IAAI,YAAY;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAQ,QAA4C;AACxD,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC;AAC3E,WAAO,MAAM,aAAa,GAAG,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,SAAmF;AAChG,UAAM,aAAa,CAAC;AACpB,QAAI,SAAS,OAAQ,YAAW,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM,CAAC;AACpE,QAAI,SAAS,OAAQ,YAAW,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM,CAAC;AAEpE,UAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,IAAI,EACT,MAAM,WAAW,SAAS,IAAI,GAAG,UAAU,IAAI,MAAS,EACxD,QAAQ,KAAK,KAAK,SAAS,CAAC,EAC5B,MAAM,GAAG;AACZ,WAAO,KAAK,IAAI,WAAW;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAO,OAA0C;AACrD,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC;AACxE,WAAO,MAAM,YAAY,GAAG,IAAI;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,MAAc,cAAwB,aAA2C;AAClG,UAAM,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,MAAM,IAAI,CAAC;AAEhF,QAAI,UAAU;AACZ,YAAM,CAAC,OAAO,IAAI,MAAM,KAAK,GAAG,OAAO,KAAK,EACzC,IAAI,EAAE,cAAc,QAAQ,UAAU,iBAAiBC,aAAY,WAAWA,YAAW,CAAC,EAC1F,MAAM,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,EAC/B,UAAU;AACb,aAAO,aAAa,OAAO;AAAA,IAC7B;AAEA,UAAM,SAAS,eAAe,OAAO,MAAM;AAC3C,UAAM,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,OAAO,KAAK,EAAE,OAAO;AAAA,MACpD,IAAI;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAc,QAAQ;AAAA,MAAU,iBAAiBA;AAAA,IACrE,CAAC,EAAE,UAAU;AACb,WAAO,aAAa,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,wBAAwB,OAA0E;AACtG,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GACtB,OAAO,EAAE,WAAW,KAAK,QAAQ,YAAY,MAAM,OAAO,CAAC,EAC3D,KAAK,IAAI,EACT,UAAU,OAAO,GAAG,MAAM,IAAI,KAAK,MAAM,CAAC,EAC1C,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC;AAC3B,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,QAAgB,cAAwD;AACrF,WAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAC7C,YAAM,GAAG,QAAQA;AAAA;AAAA,6BAEM,YAAY;AAAA;AAAA,qBAEpB,MAAM;AAAA,OACpB;AAED,YAAM,aAAa,MAAM,GAAG,QAAQA;AAAA;AAAA,kDAEQ,YAAY;AAAA;AAAA;AAAA;AAAA,OAIvD;AAED,UAAI,WAAW,KAAK,WAAW,EAAG,QAAO;AAEzC,YAAM,UAAU,WAAW,KAAK,CAAC;AACjC,YAAM,SAAS,OAAO,QAAQ,EAAE;AAEhC,YAAM,gBAAgB,MAAM,GAAG,QAAQA;AAAA,oFACuC,MAAM;AAAA,OACnF;AACD,YAAM,UAAU,OAAQ,cAAc,KAAK,CAAC,EAA8B,WAAW,IAAI;AAEzF,YAAM,QAAQ,OAAO,KAAK;AAE1B,YAAM,YAAY,MAAM,GAAG,QAAQA;AAAA;AAAA,kBAEvB,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA;AAAA,OAElD;AAED,YAAM,GAAG,QAAQA;AAAA,8EACuD,MAAM;AAAA,OAC7E;AAED,aAAO;AAAA,QACL,MAAM,WAAW,OAAO;AAAA,QACxB,KAAK,UAAU,UAAU,KAAK,CAAC,CAA4B;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,OAAe,QAA6B,OAA2C;AAC3G,WAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAC7C,YAAM,gBAAgB,MAAM,GAAG,QAAQA;AAAA;AAAA;AAAA,uBAGtB,KAAK;AAAA;AAAA,OAErB;AAED,UAAI,cAAc,KAAK,WAAW,EAAG,QAAO;AAE5C,YAAM,aAAa,cAAc,KAAK,CAAC;AACvC,YAAM,oBAAoB,OAAO,WAAW,WAAW;AAEvD,UAAI,sBAAsB,eAAe,WAAW,aAAa;AAC/D,eAAO,UAAU,UAAU;AAAA,MAC7B;AAEA,YAAM,aAAa,WAAW,eAAe,WAAW,YAAY,WAAW;AAC/E,YAAM,CAAC,UAAU,IAAI,MAAM,GAAG,OAAO,IAAI,EACtC,IAAI,aACD,EAAE,QAAQ,OAAO,SAAS,MAAM,SAASA,aAAY,WAAWA,YAAW,IAC3E,EAAE,QAAQ,OAAO,SAAS,MAAM,WAAWA,YAAW,CAAC,EAC1D,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,EACxB,UAAU;AAEb,UAAI,CAAC,WAAY,QAAO;AAExB,YAAM,iBAAiB,aAAa,SAAS;AAC7C,UAAI,sBAAsB,eAAe,WAAW,aAAa;AAC/D,cAAM,GAAG,OAAO,KAAK,EAClB,IAAI,EAAE,QAAQ,gBAAgB,WAAWA,YAAW,CAAC,EACrD,MAAM,GAAG,MAAM,IAAI,WAAW,MAAM,CAAC;AAAA,MAC1C;AAEA,aAAO,YAAY,UAAU;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,OAAe,MAAsC;AACvE,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,KAAK,GAAG,OAAO,OAAO,EAAE;AAAA,MAC5B,KAAK,IAAI,CAAC,SAAS;AAAA,QACjB;AAAA,QACA,UAAU,IAAI,YAAY;AAAA,QAC1B,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,MACf,EAAE;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,OAAwC;AACvD,UAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,OAAO,EACZ,MAAM,GAAG,QAAQ,OAAO,KAAK,CAAC,EAC9B,QAAQ,IAAI,QAAQ,SAAS,CAAC;AACjC,WAAO,KAAK,IAAI,WAAW;AAAA,EAC7B;AAAA,EAEA,MAAM,eAAe,OAAe,OAA+C;AACjF,UAAM,aAAa,OAAO,UAAU;AACpC,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,SAAS,EAAE,OAAO;AAAA,MACnD,IAAI;AAAA,MACJ;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM,YAAY;AAAA,IAC9B,CAAC,EAAE,UAAU;AACb,WAAO,iBAAiB,GAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAAiB,OAA0C;AAC/D,UAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,SAAS,EACd,MAAM,GAAG,UAAU,OAAO,KAAK,CAAC,EAChC,QAAQ,IAAI,UAAU,SAAS,CAAC;AACnC,WAAO,KAAK,IAAI,gBAAgB;AAAA,EAClC;AAAA,EAEA,MAAM,UAAU,QAA4C;AAC1D,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,KAAK,EACrC,IAAI,EAAE,QAAQ,UAAU,WAAWA,YAAW,CAAC,EAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,MAAM,QAAQ,QAAQ,CAAC,CAAC,EAC3D,UAAU;AACb,WAAO,MAAM,aAAa,GAAG,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,QAA4C;AAC3D,WAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAC7C,YAAM,aAAa,MAAM,GAAG,QAAQA;AAAA,yCACD,MAAM;AAAA,OACxC;AAED,UAAI,WAAW,KAAK,WAAW,EAAG,QAAO;AAEzC,YAAM,UAAU,WAAW,KAAK,CAAC;AACjC,YAAM,aAAa,OAAO,QAAQ,MAAM;AAExC,UAAI,eAAe,eAAe,eAAe,YAAY,eAAe,aAAa;AACvF,eAAO;AAAA,MACT;AAEA,UAAI,eAAe,cAAc,eAAe,WAAW;AACzD,cAAM,YAAY,MAAM,GAAG,QAAQA;AAAA,+CACI,MAAM;AAAA,SAC5C;AAED,YAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,gBAAM,SAAS,UAAU,KAAK,CAAC;AAC/B,gBAAM,YAAY,OAAO,OAAO,MAAM;AACtC,cAAI,cAAc,eAAe,cAAc,YAAY,cAAc,aAAa;AACpF,kBAAM,GAAG,QAAQA;AAAA;AAAA;AAAA,2BAGF,OAAO,EAAE;AAAA,aACvB;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAEA,YAAM,CAAC,WAAW,IAAI,MAAM,GAAG,OAAO,KAAK,EACxC,IAAI,EAAE,QAAQ,aAAa,WAAWA,YAAW,CAAC,EAClD,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,EAC1B,UAAU;AAEb,aAAO,aAAa,WAAW;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,OAAe,OAAsD;AAC1F,WAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAC7C,YAAM,YAAY,MAAM,GAAG,QAAQA;AAAA,iGACwD,KAAK;AAAA,OAC/F;AACD,YAAM,WAAW,OAAQ,UAAU,KAAK,CAAC,EAA8B,QAAQ;AAE/E,YAAM,CAAC,QAAQ,IAAI,MAAM,GAAG,OAAO,cAAc,EAC9C,OAAO,EAAE,OAAO,UAAU,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,CAAC,EACpE,UAAU;AAEb,aAAO,mBAAmB,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAAe,eAAiD;AACnF,UAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,cAAc,EACnB,MAAM,IAAI,GAAG,eAAe,OAAO,KAAK,GAAG,GAAG,eAAe,UAAU,aAAa,CAAC,CAAC,EACtF,QAAQ,IAAI,eAAe,QAAQ,CAAC;AACvC,WAAO,KAAK,IAAI,kBAAkB;AAAA,EACpC;AAAA,EAEA,MAAM,mBAAmB,OAAe,UAAiC;AACvE,UAAM,KAAK,GAAG,OAAO,cAAc,EAChC,IAAI,EAAE,aAAaA,YAAW,CAAC,EAC/B,MAAM,IAAI,GAAG,eAAe,OAAO,KAAK,GAAG,GAAG,eAAe,UAAU,QAAQ,CAAC,CAAC;AAAA,EACtF;AACF;;;AGjZA,SAAS,OAAAC,MAAK,OAAAC,MAAK,QAAAC,OAAM,MAAAC,KAAI,MAAAC,WAAe;;;ACA5C;AAAA;AAAA,mBAAAC;AAAA,EAAA,aAAAC;AAAA,EAAA,sBAAAC;AAAA,EAAA,eAAAC;AAAA,EAAA,YAAAC;AAAA,EAAA,aAAAC;AAAA;AAAA,SAAS,UAAAC,SAAQ,OAAAC,YAAW;AAC5B,SAAS,SAAAC,QAAO,WAAAC,UAAS,aAAa,QAAAC,OAAM,eAAAC,oBAAmB;AAE/D,IAAM,aAAaJ;AAEZ,IAAMF,SAAQ,YAAY,SAAS;AAAA,EACxC,IAAIK,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAMA,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,SAASA,MAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,SAASA,MAAK,WAAW,EAAE,MAAM,OAAO,CAAC,EAAE,MAA+B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChG,UAAUA,MAAK,YAAY,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnF,QAAQA,MAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,EAC1D,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAC5D,GAAG,CAAC,WAAW;AAAA,EACb,oBAAoBF,OAAM,6BAA6B,EAAE,GAAG,MAAM,QAAQ,MAAM,SAAS;AAC3F,EAAE;AAEK,IAAMP,SAAQ,YAAY,SAAS;AAAA,EACxC,IAAIS,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAMA,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,cAAcA,MAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3F,QAAQA,MAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,QAAQ;AAAA,EACjD,iBAAiBA,MAAK,mBAAmB;AAAA,EACzC,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,EAC1D,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAC5D,CAAC;AAEM,IAAMN,QAAO,YAAY,QAAQ;AAAA,EACtC,IAAIM,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,QAAQA,MAAK,SAAS,EAAE,QAAQ,EAAE,WAAW,MAAML,OAAM,EAAE;AAAA,EAC3D,QAAQK,MAAK,SAAS,EAAE,QAAQ,EAAE,WAAW,MAAMT,OAAM,EAAE;AAAA,EAC3D,SAASQ,SAAQ,SAAS,EAAE,QAAQ;AAAA,EACpC,QAAQC,MAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAWA,MAAK,YAAY;AAAA,EAC5B,SAASA,MAAK,UAAU;AAAA,EACxB,OAAOA,MAAK,OAAO;AAAA,EACnB,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,EAC1D,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAC5D,GAAG,CAAC,WAAW;AAAA,EACb,WAAWF,OAAM,kBAAkB,EAAE,GAAG,MAAM,MAAM;AAAA,EACpD,WAAWA,OAAM,kBAAkB,EAAE,GAAG,MAAM,MAAM;AACtD,EAAE;AAEK,IAAML,WAAU,YAAY,YAAY;AAAA,EAC7C,IAAIM,SAAQ,IAAI,EAAE,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EACpD,OAAOC,MAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAMN,MAAK,EAAE;AAAA,EACxD,UAAUM,MAAK,WAAW;AAAA,EAC1B,QAAQA,MAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,SAASA,MAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,WAAWA,MAAK,WAAW,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAC3D,GAAG,CAAC,WAAW;AAAA,EACb,mBAAmBF,OAAM,+BAA+B,EAAE,GAAG,MAAM,OAAO,MAAM,SAAS;AAC3F,EAAE;AAEK,IAAMR,aAAY,YAAY,aAAa;AAAA,EAChD,IAAIU,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,OAAOA,MAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAMN,MAAK,EAAE;AAAA,EACxD,MAAMM,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAMA,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAMA,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,UAAUA,MAAK,YAAY,EAAE,MAAM,OAAO,CAAC,EAAE,MAA+B;AAAA,EAC5E,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAC5D,GAAG,CAAC,WAAW;AAAA,EACb,UAAUF,OAAM,sBAAsB,EAAE,GAAG,MAAM,KAAK;AACxD,EAAE;AAEK,IAAMN,kBAAiB,YAAY,oBAAoB;AAAA,EAC5D,IAAIO,SAAQ,IAAI,EAAE,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EACpD,OAAOC,MAAK,QAAQ,EAAE,QAAQ,EAAE,WAAW,MAAMN,MAAK,EAAE;AAAA,EACxD,UAAUK,SAAQ,UAAU,EAAE,QAAQ;AAAA,EACtC,MAAMC,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,SAASA,MAAK,WAAW,EAAE,MAAM,OAAO,CAAC,EAAE,MAA+B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChG,WAAWA,MAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,EAC1D,aAAaA,MAAK,cAAc;AAClC,GAAG,CAAC,WAAW;AAAA,EACb,sBAAsBC,aAAY,mCAAmC,EAAE,GAAG,MAAM,OAAO,MAAM,QAAQ;AAAA,EACrG,gBAAgBH,OAAM,kCAAkC,EAAE,GAAG,MAAM,OAAO,MAAM,QAAQ,EAAE,MAAMF,QAAO,MAAM,WAAW,CAAC;AAC3H,EAAE;;;ADxDF,SAAS,SAAiB;AACxB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAIA,SAASM,cAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,SAAS,IAAI;AAAA,IACb,UAAU,IAAI,YAAY,CAAC;AAAA,IAC3B,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAASC,aAAY,KAA0C;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI,aAAa;AAAA,IAC5B,SAAS,IAAI,WAAW;AAAA,IACxB,OAAO,IAAI,SAAS;AAAA,EACtB;AACF;AAEA,SAASC,cAAa,KAA4C;AAChE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,cAAc,IAAI,gBAAgB,CAAC;AAAA,IACnC,QAAQ,IAAI;AAAA,IACZ,iBAAiB,IAAI,mBAAmB;AAAA,EAC1C;AACF;AAEA,SAASC,aAAY,KAAgD;AACnE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,UAAU,IAAI,YAAY;AAAA,IAC1B,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAASC,kBAAiB,KAAoD;AAC5E,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,UAAU,IAAI,YAAY;AAAA,IAC1B,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAASC,oBAAmB,KAAwD;AAClF,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,aAAa,IAAI,eAAe;AAAA,EAClC;AACF;AAkBA,SAASC,YAAW,KAA6B;AAC/C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IAAI,MAAM,IAAI;AAAA,IAAM,SAAS,IAAI;AAAA,IACzC,SAAS,KAAK,MAAM,IAAI,OAAO;AAAA,IAC/B,UAAU,KAAK,MAAM,IAAI,QAAQ;AAAA,IACjC,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,IAAY,WAAW,IAAI;AAAA,EAC5C;AACF;AAEA,SAASC,WAAU,KAA2B;AAC5C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IAAI,QAAQ,IAAI;AAAA,IAAS,QAAQ,IAAI;AAAA,IAC7C,SAAS,IAAI;AAAA,IAAS,QAAQ,IAAI;AAAA,IAClC,WAAW,IAAI,cAAc;AAAA,IAAM,SAAS,IAAI,YAAY;AAAA,IAC5D,OAAO,IAAI,SAAS;AAAA,EACtB;AACF;AAEO,IAAM,cAAN,MAA4C;AAAA,EACjD,YAA6B,IAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EAE7B,MAAM,WAAW,OAA6C;AAC5D,UAAM,MAAM,OAAO;AACnB,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAOC,MAAK,EAAE,OAAO;AAAA,MAC/C,IAAI,OAAO,MAAM;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,UAAU,MAAM,YAAY,CAAC;AAAA,MAC7B,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,IACb,CAAC,EAAE,UAAU;AACb,WAAOR,cAAa,GAAG;AAAA,EACzB;AAAA,EAEA,MAAM,UAAU,QAAsD;AACpE,UAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKQ,MAAK,EAC3C,MAAM,SAASC,IAAGD,OAAM,QAAQ,MAAM,IAAI,MAAS,EACnD,QAAQE,MAAKF,OAAM,SAAS,CAAC,EAAE,MAAM,GAAG;AAC3C,WAAO,KAAK,IAAIR,aAAY;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAQ,QAA4C;AACxD,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKQ,MAAK,EAAE,MAAMC,IAAGD,OAAM,IAAI,MAAM,CAAC;AAC3E,WAAO,MAAMR,cAAa,GAAG,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,SAAmF;AAChG,UAAM,QAAQ,CAAC;AACf,QAAI,SAAS,OAAQ,OAAM,KAAKS,IAAGE,MAAK,QAAQ,QAAQ,MAAM,CAAC;AAC/D,QAAI,SAAS,OAAQ,OAAM,KAAKF,IAAGE,MAAK,QAAQ,QAAQ,MAAM,CAAC;AAC/D,UAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKA,KAAI,EAC1C,MAAM,MAAM,SAASC,KAAI,GAAG,KAAK,IAAI,MAAS,EAC9C,QAAQF,MAAKC,MAAK,SAAS,CAAC,EAAE,MAAM,GAAG;AAC1C,WAAO,KAAK,IAAIV,YAAW;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAO,OAA0C;AACrD,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKU,KAAI,EAAE,MAAMF,IAAGE,MAAK,IAAI,KAAK,CAAC;AACxE,WAAO,MAAMV,aAAY,GAAG,IAAI;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,MAAc,cAAwB,aAA2C;AAClG,UAAM,MAAM,OAAO;AACnB,UAAM,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKY,MAAK,EAAE,MAAMJ,IAAGI,OAAM,MAAM,IAAI,CAAC;AAChF,QAAI,UAAU;AACZ,YAAM,CAAC,OAAO,IAAI,MAAM,KAAK,GAAG,OAAOA,MAAK,EACzC,IAAI,EAAE,cAAc,QAAQ,UAAU,iBAAiB,KAAK,WAAW,IAAI,CAAC,EAC5E,MAAMJ,IAAGI,OAAM,IAAI,SAAS,EAAE,CAAC,EAAE,UAAU;AAC9C,aAAOX,cAAa,OAAO;AAAA,IAC7B;AACA,UAAM,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,OAAOW,MAAK,EAAE,OAAO;AAAA,MACpD,IAAI,eAAe,OAAO,MAAM;AAAA,MAAG;AAAA,MAAM;AAAA,MACzC,QAAQ;AAAA,MAAU,iBAAiB;AAAA,MAAK,WAAW;AAAA,MAAK,WAAW;AAAA,IACrE,CAAC,EAAE,UAAU;AACb,WAAOX,cAAa,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,wBAAwB,OAA0E;AACtG,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GACtB,OAAO,EAAE,WAAWS,MAAK,QAAQ,YAAYH,OAAM,OAAO,CAAC,EAC3D,KAAKG,KAAI,EAAE,UAAUH,QAAOC,IAAGD,OAAM,IAAIG,MAAK,MAAM,CAAC,EAAE,MAAMF,IAAGE,MAAK,IAAI,KAAK,CAAC;AAClF,WAAO,MAAM,EAAE,WAAW,IAAI,WAAW,YAAY,IAAI,cAAc,GAAG,IAAI;AAAA,EAChF;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAgB,cAAwD;AACrF,UAAM,MAAM,OAAO;AACnB,UAAM,KAAK,GAAG,OAAOE,MAAK,EACvB,IAAI,EAAE,cAAc,QAAQ,UAAU,iBAAiB,KAAK,WAAW,IAAI,CAAC,EAC5E,MAAMJ,IAAGI,OAAM,IAAI,MAAM,CAAC;AAE7B,UAAM,MAAM,KAAK,GAAG;AACpB,WAAO,IAAI,YAAY,MAAM;AAC3B,YAAM,SAAS,IAAI,IAAI,YAAY;AACnC,YAAM,SAAS,IAAI;AAAA,QACjB;AAAA,MACF,EAAE,IAAI;AAEN,YAAM,OAAO,OAAO;AAAA,QAAK,CAAC,MACvB,KAAK,MAAM,EAAE,QAAQ,EAAe,MAAM,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,MACjE;AACA,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,EAAE,YAAY,IAAI,IAAI;AAAA,QAC1B;AAAA,MACF,EAAE,IAAI,KAAK,EAAE;AAEb,YAAM,QAAQ,OAAO,KAAK;AAC1B,UAAI;AAAA,QACF;AAAA,MACF,EAAE,IAAI,OAAO,KAAK,IAAI,QAAQ,cAAc,GAAG,KAAK,KAAK,GAAG;AAE5D,UAAI,QAAQ,mEAAmE,EAAE,IAAI,KAAK,KAAK,EAAE;AAEjG,aAAO;AAAA,QACL,MAAMP,YAAW,IAAI;AAAA,QACrB,KAAKC,WAAU,IAAI,QAAQ,iCAAiC,EAAE,IAAI,KAAK,CAAc;AAAA,MACvF;AAAA,IACF,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,gBAAgB,OAAe,QAA6B,OAA2C;AAC3G,UAAM,MAAM,KAAK,GAAG;AACpB,WAAO,IAAI,YAAY,MAAM;AAC3B,YAAM,UAAU,IAAI;AAAA,QAClB;AAAA,MACF,EAAE,IAAI,KAAK;AACX,UAAI,CAAC,QAAS,QAAO;AAErB,UAAI,QAAQ,gBAAgB,eAAe,WAAW,aAAa;AACjE,eAAOA,WAAU,OAAO;AAAA,MAC1B;AAEA,YAAM,MAAM,OAAO;AACnB,YAAM,aAAa,WAAW,eAAe,WAAW,YAAY,WAAW;AAC/E,UAAI,YAAY;AACd,YAAI;AAAA,UACF;AAAA,QACF,EAAE,IAAI,QAAQ,SAAS,MAAM,KAAK,KAAK,KAAK;AAAA,MAC9C,OAAO;AACL,YAAI;AAAA,UACF;AAAA,QACF,EAAE,IAAI,QAAQ,SAAS,MAAM,KAAK,KAAK;AAAA,MACzC;AAEA,YAAM,aAAa,IAAI,QAAQ,iCAAiC,EAAE,IAAI,KAAK;AAC3E,YAAM,iBAAiB,aAAa,SAAS;AAC7C,UAAI,QAAQ,gBAAgB,eAAe,WAAW,aAAa;AACjE,YAAI,QAAQ,0DAA0D,EAAE;AAAA,UACtE;AAAA,UAAgB;AAAA,UAAK,WAAW;AAAA,QAClC;AAAA,MACF;AACA,aAAOA,WAAU,UAAU;AAAA,IAC7B,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,cAAc,OAAe,MAAsC;AACvE,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,MAAM,OAAO;AACnB,UAAM,KAAK,GAAG,OAAOO,QAAO,EAAE;AAAA,MAC5B,KAAK,IAAI,CAAC,SAAS;AAAA,QACjB;AAAA,QAAO,UAAU,IAAI,YAAY;AAAA,QACjC,QAAQ,IAAI;AAAA,QAAQ,SAAS,IAAI;AAAA,QAAS,WAAW;AAAA,MACvD,EAAE;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,OAAwC;AACvD,UAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKA,QAAO,EAC7C,MAAML,IAAGK,SAAQ,OAAO,KAAK,CAAC,EAAE,QAAQC,KAAID,SAAQ,SAAS,CAAC;AACjE,WAAO,KAAK,IAAIX,YAAW;AAAA,EAC7B;AAAA,EAEA,MAAM,eAAe,OAAe,OAA+C;AACjF,UAAM,MAAM,OAAO;AACnB,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAOa,UAAS,EAAE,OAAO;AAAA,MACnD,IAAI,OAAO,UAAU;AAAA,MAAG;AAAA,MAAO,MAAM,MAAM;AAAA,MAAM,MAAM,MAAM;AAAA,MAC7D,MAAM,MAAM;AAAA,MAAM,UAAU,MAAM,YAAY;AAAA,MAAM,WAAW;AAAA,IACjE,CAAC,EAAE,UAAU;AACb,WAAOZ,kBAAiB,GAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAAiB,OAA0C;AAC/D,UAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKY,UAAS,EAC/C,MAAMP,IAAGO,WAAU,OAAO,KAAK,CAAC,EAAE,QAAQD,KAAIC,WAAU,SAAS,CAAC;AACrE,WAAO,KAAK,IAAIZ,iBAAgB;AAAA,EAClC;AAAA,EAEA,MAAM,UAAU,QAA4C;AAC1D,UAAM,CAAC,GAAG,IAAI,MAAM,KAAK,GAAG,OAAOI,MAAK,EACrC,IAAI,EAAE,QAAQ,UAAU,WAAW,OAAO,EAAE,CAAC,EAC7C,MAAMI,KAAIH,IAAGD,OAAM,IAAI,MAAM,GAAGC,IAAGD,OAAM,QAAQ,QAAQ,CAAC,CAAC,EAAE,UAAU;AAC1E,WAAO,MAAMR,cAAa,GAAG,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,QAA4C;AAC3D,UAAM,MAAM,KAAK,GAAG;AACpB,WAAO,IAAI,YAAY,MAAM;AAC3B,YAAM,UAAU,IAAI,QAAQ,kCAAkC,EAAE,IAAI,MAAM;AAC1E,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,WAAW,oBAAI,IAAI,CAAC,aAAa,UAAU,WAAW,CAAC;AAC7D,UAAI,SAAS,IAAI,QAAQ,MAAM,EAAG,QAAO;AAEzC,YAAM,MAAM,OAAO;AACnB,UAAI,QAAQ,WAAW,cAAc,QAAQ,WAAW,WAAW;AACjE,cAAM,YAAY,IAAI;AAAA,UACpB;AAAA,QACF,EAAE,IAAI,MAAM;AAEZ,YAAI,aAAa,CAAC,SAAS,IAAI,UAAU,MAAM,GAAG;AAChD,cAAI;AAAA,YACF;AAAA,UACF,EAAE,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,QAC9B;AAAA,MACF;AAEA,UAAI,QAAQ,oEAAoE,EAAE,IAAI,KAAK,MAAM;AACjG,aAAOM,YAAW,IAAI,QAAQ,kCAAkC,EAAE,IAAI,MAAM,CAAe;AAAA,IAC7F,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,iBAAiB,OAAe,OAAsD;AAC1F,UAAM,MAAM,KAAK,GAAG;AACpB,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,IAAI,YAAY,MAAM;AAClC,YAAM,EAAE,SAAS,IAAI,IAAI;AAAA,QACvB;AAAA,MACF,EAAE,IAAI,KAAK;AAEX,UAAI;AAAA,QACF;AAAA,MACF,EAAE,IAAI,OAAO,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,OAAO,GAAG,GAAG;AAErE,aAAO,IAAI;AAAA,QACT;AAAA,MACF,EAAE,IAAI,OAAO,QAAQ;AAAA,IAIvB,CAAC,EAAE;AAEH,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MAAI,OAAO,MAAM;AAAA,MAAQ,UAAU,MAAM;AAAA,MACnD,MAAM,MAAM;AAAA,MACZ,SAAS,KAAK,MAAM,MAAM,OAAO;AAAA,MACjC,WAAW,MAAM;AAAA,MAAY,aAAa,MAAM,gBAAgB;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,OAAe,eAAiD;AACnF,UAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAKW,eAAc,EACpD,MAAML,KAAIH,IAAGQ,gBAAe,OAAO,KAAK,GAAGC,IAAGD,gBAAe,UAAU,aAAa,CAAC,CAAC,EACtF,QAAQF,KAAIE,gBAAe,QAAQ,CAAC;AACvC,WAAO,KAAK,IAAIZ,mBAAkB;AAAA,EACpC;AAAA,EAEA,MAAM,mBAAmB,OAAe,UAAiC;AACvE,UAAM,KAAK,GAAG,OAAOY,eAAc,EAChC,IAAI,EAAE,aAAa,OAAO,EAAE,CAAC,EAC7B,MAAML,KAAIH,IAAGQ,gBAAe,OAAO,KAAK,GAAGR,IAAGQ,gBAAe,UAAU,QAAQ,CAAC,CAAC;AAAA,EACtF;AACF;;;AJ1WA,IAAM,QAAQ,oBAAI,IAAkB;AAE7B,SAAS,QAAQ,aAA2B;AACjD,QAAM,WAAW,MAAM,IAAI,WAAW;AACtC,MAAI,SAAU,QAAO;AACrB,QAAM,OAAO,IAAI,KAAK,EAAE,kBAAkB,YAAY,CAAC;AACvD,QAAM,IAAI,aAAa,IAAI;AAC3B,SAAO;AACT;AAEO,SAAS,WAAW,MAAuB;AAChD,SAAO,UAAU,MAAM,EAAE,QAAQ,WAAS,CAAC;AAC7C;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,QAAM,OAAO,IAAI,WAAW,WAAW,IAAI,IAAI,MAAM,YAAY,MAAM,IAAI;AAC3E,MAAI,CAAC,KAAM,QAAOE,MAAKC,SAAQ,GAAG,cAAc,cAAc;AAC9D,MAAI,KAAK,WAAW,IAAI,EAAG,QAAOD,MAAKC,SAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAC/D,SAAO;AACT;AAEO,SAAS,YAAY,aAAmC;AAC7D,QAAM,MAAM,eAAe;AAE3B,MAAI,IAAI,WAAW,aAAa,KAAK,IAAI,WAAW,eAAe,GAAG;AACpE,UAAM,OAAO,QAAQ,GAAG;AACxB,WAAO;AAAA,MACL,OAAO,IAAI,QAAQ,WAAW,IAAI,CAAC;AAAA,MACnC,OAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,WAAW,gBAAgB,GAAG;AACpC,YAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,SAAS,IAAI,SAAS,QAAQ;AACpC,SAAO,OAAO,oBAAoB;AAClC,SAAO,OAAO,sBAAsB;AACpC,QAAM,KAAK,cAAc,QAAQ,EAAE,QAAQ,eAAa,CAAC;AACzD,SAAO;AAAA,IACL,OAAO,IAAI,YAAY,EAAE;AAAA,IACzB,OAAO,YAAY;AAAE,aAAO,MAAM;AAAA,IAAG;AAAA,EACvC;AACF;;;AMjDO,IAAM,mBAAN,MAAkD;AAAA,EACvD,YAA6B,OAAuB;AAAvB;AAAA,EAAwB;AAAA,EAAxB;AAAA,EAE7B,WAAW,OAA6C;AACtD,WAAO,KAAK,MAAM,WAAW,KAAK;AAAA,EACpC;AAAA,EAEA,UAAU,QAA4C;AACpD,WAAO,KAAK,MAAM,UAAU,MAAM;AAAA,EACpC;AAAA,EAEA,WAAW,QAA4C;AACrD,WAAO,KAAK,MAAM,WAAW,MAAM;AAAA,EACrC;AAAA,EAEA,gBAAgB,OAAe,QAAmB,OAA2C;AAC3F,WAAO,KAAK,MAAM,gBAAgB,OAAO,QAAQ,KAAK;AAAA,EACxD;AAAA,EAEA,cAAc,OAAe,MAAsC;AACjE,WAAO,KAAK,MAAM,cAAc,OAAO,IAAI;AAAA,EAC7C;AAAA,EAEA,eAAe,OAAe,OAA+C;AAC3E,WAAO,KAAK,MAAM,eAAe,OAAO,KAAK;AAAA,EAC/C;AAAA,EAEA,iBAAiB,OAAe,OAAsD;AACpF,WAAO,KAAK,MAAM,iBAAiB,OAAO,KAAK;AAAA,EACjD;AAAA,EAEA,mBAAmB,OAAe,UAAiC;AACjE,WAAO,KAAK,MAAM,mBAAmB,OAAO,QAAQ;AAAA,EACtD;AACF;;;AChDA,SAAS,KAAAC,UAAS;AAGlB,IAAM,aAAa;AAAA,EACjB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AACrC;AAEA,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EAC/B,MAAMA,GAAE,QAAQ,YAAY;AAAA,EAC5B,SAASA,GAAE,QAAQ,OAAO;AAAA,EAC1B,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAASA,GAAE,OAAO;AAAA,IAChB,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACnC,KAAKA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAChC,GAAG;AAAA,EACL,CAAC;AACH,CAAC;AAED,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EAC/B,MAAMA,GAAE,QAAQ,WAAW;AAAA,EAC3B,SAASA,GAAE,QAAQ,OAAO;AAAA,EAC1B,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAASA,GAAE,OAAO;AAAA,IAChB,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACxB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAClC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACnC,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC1C,CAAC;AACH,CAAC;AAED,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,MAAMA,GAAE,QAAQ,iBAAiB;AAAA,EACjC,SAASA,GAAE,QAAQ,QAAQ;AAAA,EAC3B,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAASA,GAAE,OAAO;AAAA,IAChB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACvB,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACxB,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,CAAC;AACH,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACnC,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,aAAaA,GAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAED,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EAC/B,MAAMA,GAAE,QAAQ,WAAW;AAAA,EAC3B,SAASA,GAAE,QAAQ,OAAO;AAAA,EAC1B,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAAS;AACX,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,MAAMA,GAAE,QAAQ,WAAW;AAAA,EAC3B,SAASA,GAAE,QAAQ,aAAa;AAAA,EAChC,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAAS;AACX,CAAC;AAED,IAAM,aAAaA,GAAE,mBAAmB,WAAW;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,wBAAwB,OAAiC;AACvE,SAAO,WAAW,MAAM,KAAK;AAC/B;AAEA,IAAM,mBAAmBA,GAAE,mBAAmB,QAAQ;AAAA,EACpDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,OAAO;AAAA,IACvB,SAASA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,CAAC;AAAA,EACxC,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,SAASA,GAAE,OAAO,EAAE,QAAQA,GAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC,EAAE,CAAC;AAAA,EACxE,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,SAASA,GAAE,OAAO;AAAA,MAChB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAChC,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAEM,SAAS,mBAAmB,OAAuC;AACxE,SAAO,iBAAiB,MAAM,KAAK;AACrC;;;AClGO,SAAS,iBAAiB,qBAA6D;AAC5F,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,mBAAmB,KAAK,oBAAoB,KAAK,CAAC;AAChE,SAAO,QAAQ,CAAC;AAClB;AAEO,SAAS,mBAAmB,UAA8B,UAAuC;AACtG,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,aAAa;AACtB;AAEO,SAAS,iBAAiB,KAA0C;AACzE,QAAM,SAAS,IAAI,QAAQ;AAC3B,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAClD,SAAO,iBAAiB,KAAK;AAC/B;;;ACdO,SAAS,eACd,KACA,KACA,MACA,QACS;AACT,QAAM,SAAS,iBAAiB,GAAG;AAEnC,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,mBAAmB,QAAQ,OAAO,SAAS,GAAG;AACjD,UAAI,aAAa;AACjB,UAAI,UAAU,gBAAgB,kBAAkB;AAChD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,4BAA4B,CAAC,CAAC;AAC9D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,YAAY;AACvB,QAAI,CAAC,mBAAmB,QAAQ,OAAO,aAAa,GAAG;AACrD,UAAI,aAAa;AACjB,UAAI,UAAU,gBAAgB,kBAAkB;AAChD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,gCAAgC,CAAC,CAAC;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,QAAgB,UAA6B;AACxE,MAAI,aAAa,YAAY;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU,aAAa,mBAAmB;AACvD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,yBAAyB,KAAK,QAAQ,GAAG;AAChE,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,0BAA0B,KAAK,QAAQ,GAAG;AACjE,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,wBAAwB,KAAK,QAAQ,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,6BAA6B,KAAK,QAAQ,GAAG;AACpE,WAAO;AAAA,EACT;AACA,MAAI,WAAW,SAAS,yBAAyB,KAAK,QAAQ,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,yCAAyC,KAAK,QAAQ,GAAG;AAChF,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU,yBAAyB,KAAK,QAAQ,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU,aAAa,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,0BAA0B,KAAK,QAAQ,GAAG;AACjE,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,2BAA2B,KAAK,QAAQ,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,MAAiB,QAA6B;AACpF,MAAI,SAAS,QAAQ;AACnB,WAAO,QAAQ,OAAO,SAAS;AAAA,EACjC;AACA,MAAI,SAAS,YAAY;AACvB,WAAO,QAAQ,OAAO,aAAa;AAAA,EACrC;AACA,SAAO;AACT;;;AZtFA,IAAM,eAAe,oBAAI,IAAe,CAAC,UAAU,YAAY,WAAW,aAAa,UAAU,WAAW,CAAC;AAE7G,SAAS,YAAY,OAA6C;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,CAAC,aAAa,IAAI,KAAkB,GAAG;AACzC,UAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,EACnD;AACA,SAAO;AACT;AAEA,eAAe,SAAY,KAAkC;AAC3D,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,KAAK;AAC7B,WAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,EACjE;AACA,QAAM,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAClD,SAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AACrC;AAEA,SAAS,UAAU,KAAqB,YAAoB,SAAwB;AAClF,QAAM,OAAO,KAAK,UAAU,OAAO;AACnC,MAAI,aAAa;AACjB,MAAI,UAAU,gBAAgB,kBAAkB;AAChD,MAAI,IAAI,IAAI;AACd;AAEA,eAAe,eAAe,OAAuB,QAGlD;AACD,MAAI,QAAQ,IAAI,uBAAuB,QAAQ;AAC7C,UAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,UAAM,OAAOA,qBAAoB,KAAK;AACtC,UAAM,KAAK,OAAO;AAAA,MAChB,SAAS,QAAQ,IAAI,yBAAyB;AAAA,MAC9C,mBAAmB,OAAO;AAAA,MAC1B,cAAc,QAAQ,IAAI;AAAA,MAC1B,cAAc,QAAQ,IAAI;AAAA,IAC5B,CAAC;AACD,WAAO,EAAE,WAAW,MAAM,UAAU,MAAM,KAAK,SAAS,EAAE;AAAA,EAC5D;AAEA,SAAO,EAAE,WAAW,IAAI,iBAAiB,KAAK,GAAG,UAAU,YAAY;AAAA,EAAC,EAAE;AAC5E;AAEA,eAAe,OAAsB;AACnC,QAAM,SAAS,iBAAiB;AAChC,QAAM,EAAE,OAAO,OAAO,WAAW,IAAI,YAAY,OAAO,WAAW;AACnE,QAAM,EAAE,WAAW,UAAU,kBAAkB,IAAI,MAAM,eAAe,OAAO,MAAM;AAErF,QAAM,SAAS,aAAa,OAAO,KAAK,QAAQ;AAC9C,QAAI;AACF,UAAI,CAAC,IAAI,OAAO,CAAC,IAAI,QAAQ;AAC3B,kBAAU,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAChD;AAAA,MACF;AAEA,YAAM,MAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AAC/C,YAAM,YAAY,aAAa,IAAI,QAAQ,IAAI,QAAQ;AACvD,YAAM,aAAa,EAAE,WAAW,OAAO,WAAW,eAAe,OAAO,cAAc;AACtF,UAAI,wBAAwB,WAAW,UAAU,KAAK,CAAC,eAAe,KAAK,KAAK,WAAW,UAAU,GAAG;AACtG;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,YAAY;AACvD,kBAAU,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAChC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,UAAU;AACtD,cAAM,OAAO,MAAM,SAA0B,GAAG;AAChD,cAAM,YAAY,wBAAwB,IAAI;AAC9C,cAAM,OAAO,MAAM,UAAU,WAAW;AAAA,UACtC,MAAM,UAAU;AAAA,UAChB,SAAS,UAAU;AAAA,UACnB,SAAS,UAAU;AAAA,UACnB,UAAU,UAAU,YAAY,CAAC;AAAA,QACnC,CAAC;AACD,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,UAAU;AACrD,cAAM,SAAS,YAAY,IAAI,aAAa,IAAI,QAAQ,CAAC;AACzD,cAAMC,SAAQ,MAAM,MAAM,UAAU,MAAM;AAC1C,kBAAU,KAAK,KAAK,EAAE,OAAAA,OAAM,CAAC;AAC7B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,mBAAmB,KAAK,IAAI,QAAQ,GAAG;AACjE,cAAM,SAAS,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACxC,cAAM,OAAO,MAAM,MAAM,QAAQ,MAAM;AACvC,YAAI,CAAC,MAAM;AACT,oBAAU,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAC/C;AAAA,QACF;AACA,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,0BAA0B,KAAK,IAAI,QAAQ,GAAG;AACzE,cAAM,SAAS,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACxC,cAAM,OAAO,MAAM,UAAU,UAAU,MAAM;AAC7C,YAAI,CAAC,MAAM;AACT,oBAAU,KAAK,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACtD;AAAA,QACF;AACA,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,2BAA2B,KAAK,IAAI,QAAQ,GAAG;AAC1E,cAAM,SAAS,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACxC,cAAM,OAAO,MAAM,UAAU,WAAW,MAAM;AAC9C,YAAI,CAAC,MAAM;AACT,oBAAU,KAAK,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACxD;AAAA,QACF;AACA,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,SAAS;AACpD,cAAM,SAAS,IAAI,aAAa,IAAI,QAAQ,KAAK;AACjD,cAAM,SAAS,YAAY,IAAI,aAAa,IAAI,QAAQ,CAAC;AACzD,cAAMC,QAAO,MAAM,MAAM,SAAS,EAAE,QAAQ,OAAO,CAAC;AACpD,kBAAU,KAAK,KAAK,EAAE,MAAAA,MAAK,CAAC;AAC5B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,kBAAkB,KAAK,IAAI,QAAQ,GAAG;AAChE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,MAAM,MAAM,MAAM,OAAO,KAAK;AACpC,YAAI,CAAC,KAAK;AACR,oBAAU,KAAK,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAC9C;AAAA,QACF;AACA,kBAAU,KAAK,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,wBAAwB,KAAK,IAAI,QAAQ,GAAG;AACtE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,OAAO,MAAM,MAAM,WAAW,KAAK;AACzC,kBAAU,KAAK,KAAK,EAAE,KAAK,CAAC;AAC5B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,6BAA6B,KAAK,IAAI,QAAQ,GAAG;AAC3E,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAMC,aAAY,MAAM,MAAM,iBAAiB,KAAK;AACpD,kBAAU,KAAK,KAAK,EAAE,WAAAA,WAAU,CAAC;AACjC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,mBAAmB;AAC/D,cAAM,OAAO,MAAM,SAAoE,GAAG;AAC1F,cAAM,OAAO,MAAM,MAAM,aAAa,KAAK,MAAM,KAAK,gBAAgB,CAAC,GAAG,KAAK,MAAM;AACrF,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,yBAAyB,KAAK,IAAI,QAAQ,GAAG;AACxE,cAAM,SAAS,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACxC,cAAM,OAAO,MAAM,SAAqC,GAAG;AAC3D,cAAM,aAAa,MAAM,MAAM,SAAS,QAAQ,KAAK,gBAAgB,CAAC,CAAC;AACvE,kBAAU,KAAK,KAAK,EAAE,WAAW,CAAC;AAClC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,0BAA0B,KAAK,IAAI,QAAQ,GAAG;AACzE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,OAAO,MAAM,SAAgD,GAAG;AACtE,cAAM,MAAM,MAAM,UAAU,gBAAgB,OAAO,KAAK,QAAQ,KAAK,KAAK;AAC1E,YAAI,CAAC,KAAK;AACR,oBAAU,KAAK,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAC9C;AAAA,QACF;AACA,kBAAU,KAAK,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,wBAAwB,KAAK,IAAI,QAAQ,GAAG;AACvE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,OAAO,MAAM,SAAkC,GAAG;AACxD,cAAM,WAAW,MAAM,UAAU,cAAc,OAAO,KAAK,QAAQ,CAAC,CAAC;AACrE,kBAAU,KAAK,KAAK,EAAE,SAAS,CAAC;AAChC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,6BAA6B,KAAK,IAAI,QAAQ,GAAG;AAC5E,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,OAAO,MAAM,SAAwB,GAAG;AAC9C,cAAM,WAAW,MAAM,UAAU,eAAe,OAAO,IAAI;AAC3D,kBAAU,KAAK,KAAK,QAAQ;AAC5B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,yBAAyB,KAAK,IAAI,QAAQ,GAAG;AACxE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,MAAM,MAAM,MAAM,OAAO,KAAK;AACpC,YAAI,CAAC,KAAK;AACR,oBAAU,KAAK,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAC9C;AAAA,QACF;AACA,YAAI,IAAI,WAAW,WAAW;AAC5B,oBAAU,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAClD;AAAA,QACF;AACA,cAAM,OAAO,MAAM,SAAgC,GAAG;AACtD,cAAM,YAAY,mBAAmB,IAAI;AACzC,cAAM,QAAQ,MAAM,UAAU,iBAAiB,OAAO,SAAS;AAC/D,kBAAU,KAAK,KAAK,KAAK;AACzB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,yBAAyB,KAAK,IAAI,QAAQ,GAAG;AACvE,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC;AACvC,cAAM,gBAAgB,OAAO,IAAI,aAAa,IAAI,eAAe,KAAK,GAAG;AACzE,cAAM,SAAS,MAAM,MAAM,eAAe,OAAO,aAAa;AAC9D,kBAAU,KAAK,KAAK,EAAE,OAAO,CAAC;AAC9B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,yCAAyC,KAAK,IAAI,QAAQ,GAAG;AACxF,cAAM,QAAQ,IAAI,SAAS,MAAM,GAAG;AACpC,cAAM,QAAQ,MAAM,CAAC;AACrB,cAAM,WAAW,OAAO,MAAM,CAAC,CAAC;AAChC,cAAM,UAAU,mBAAmB,OAAO,QAAQ;AAClD,kBAAU,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAChC;AAAA,MACF;AAEA,gBAAU,KAAK,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,IAC5C,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,kBAAU,KAAK,KAAK,EAAE,OAAO,wBAAwB,SAAS,MAAM,CAAC;AACrE;AAAA,MACF;AACA,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,wBAAwB,GAAG;AAChF,kBAAU,KAAK,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAC5C;AAAA,MACF;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,gBAAU,KAAK,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO,OAAO,OAAO,MAAM,MAAM;AAC/B,YAAQ,OAAO,MAAM,kDAAkD,OAAO,IAAI;AAAA,CAAI;AAAA,EACxF,CAAC;AAED,QAAM,WAAW,YAA2B;AAC1C,UAAM,kBAAkB;AACxB,UAAM,WAAW;AACjB,WAAO,MAAM;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,MAAM;AACzB,SAAK,SAAS;AAAA,EAChB,CAAC;AACD,UAAQ,GAAG,WAAW,MAAM;AAC1B,SAAK,SAAS;AAAA,EAChB,CAAC;AACH;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,CAAI;AACzC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["homedir","join","sql","sql","and","asc","desc","eq","gt","artifacts","nodes","runInputEvents","runLogs","runs","tasks","isNull","sql","index","integer","text","uniqueIndex","toTaskRecord","toRunRecord","toNodeRecord","toLogRecord","toArtifactRecord","toInputEventRecord","mapRawTask","mapRawRun","tasks","eq","desc","runs","and","nodes","runLogs","asc","artifacts","runInputEvents","gt","join","homedir","z","createDbosWorkflows","tasks","runs","artifacts"]}
|