aegra-hono 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,41 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config/settings.ts", "../src/config/project.ts", "../src/core/schema.ts", "../src/core/database.ts", "../src/auth.ts", "../src/app.ts", "../src/core/errors.ts", "../src/module-loader.ts", "../src/middleware/auth.ts", "../src/core/validation.ts", "../src/middleware/request-context.ts", "../src/routes/assistants.ts", "../src/services/graph-registry.ts", "../src/routes/store.ts", "../src/routes/crons.ts", "../src/services/cron-scheduler.ts", "../src/routes/runs.ts", "../src/core/redis.ts", "../src/services/broker.ts", "../src/observability.ts", "../src/services/serialization.ts", "../src/services/run-stream.ts", "../src/services/protocol-stream.ts", "../src/services/streaming.ts", "../src/routes/docs.ts", "../src/routes/events.ts", "../src/routes/health.ts", "../src/routes/threads.ts", "../src/services/thread-ttl.ts", "../src/runtime.ts", "../src/services/workers.ts", "../src/index.ts"],
4
+ "sourcesContent": [
5
+ "import { z } from \"zod\";\n\nconst booleanFromEnv = z.stringbool().default(false);\nconst positiveIntFromEnv = (fallback: number) => z.coerce.number().int().positive().default(fallback);\n\nconst environmentSchema = z.object({\n PROJECT_NAME: z.string().default(\"Aegra\"),\n VERSION: z.string().default(\"0.11.0\"),\n ENV_MODE: z.string().default(\"PRODUCTION\"),\n LOG_VERBOSITY: z.string().default(\"verbose\"),\n LOG_EXCLUDE_PATHS: z.string().default(\"\"),\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().int().min(1).max(65_535).default(2026),\n AEGRA_CONFIG: z.string().default(\"aegra.json\"),\n RUN_MIGRATIONS_ON_STARTUP: z.stringbool().default(true),\n DATABASE_URL: z.string().optional(),\n POSTGRES_USER: z.string().default(\"postgres\"),\n POSTGRES_PASSWORD: z.string().default(\"postgres\"),\n POSTGRES_HOST: z.string().default(\"localhost\"),\n POSTGRES_PORT: z.coerce.number().int().min(1).max(65_535).default(5432),\n POSTGRES_DB: z.string().default(\"aegra\"),\n REDIS_BROKER_ENABLED: booleanFromEnv,\n REDIS_URL: z.string().default(\"redis://localhost:6379/0\"),\n WORKER_COUNT: positiveIntFromEnv(3),\n N_JOBS_PER_WORKER: positiveIntFromEnv(10),\n WORKER_QUEUE_KEY: z.string().default(\"aegra:jobs\"),\n BG_JOB_TIMEOUT_SECS: positiveIntFromEnv(3600),\n BG_JOB_MAX_RETRIES: z.coerce.number().int().nonnegative().default(3),\n WORKER_DRAIN_TIMEOUT: z.coerce.number().nonnegative().default(30),\n STUCK_PENDING_THRESHOLD_SECONDS: positiveIntFromEnv(120),\n LEASE_DURATION_SECONDS: positiveIntFromEnv(30),\n HEARTBEAT_INTERVAL_SECONDS: positiveIntFromEnv(10),\n REAPER_INTERVAL_SECONDS: positiveIntFromEnv(15),\n POSTGRES_POLL_INTERVAL_SECONDS: positiveIntFromEnv(5),\n KEEPALIVE_INTERVAL_SECS: positiveIntFromEnv(5),\n CRON_ENABLED: z.stringbool().default(true),\n CRON_POLL_INTERVAL_SECONDS: positiveIntFromEnv(60),\n CRON_CLAIM_DURATION_SECONDS: positiveIntFromEnv(300),\n CRON_MAX_PER_USER: z.coerce.number().int().nonnegative().default(100),\n CRON_ALLOW_SECONDS_SCHEDULE: booleanFromEnv,\n CRON_TICK_BATCH_SIZE: positiveIntFromEnv(100),\n CRON_MAX_PAYLOAD_BYTES: positiveIntFromEnv(65_536),\n AEGRA_THREAD_TTL: z.string().optional(),\n LANGGRAPH_THREAD_TTL: z.string().optional(),\n MAX_SEARCH_LIMIT: positiveIntFromEnv(1000),\n ENABLE_PROMETHEUS_METRICS: booleanFromEnv,\n FF_V2_EVENT_STREAMING: z.stringbool().default(true),\n OTEL_SERVICE_NAME: z.string().default(\"aegra-backend\"),\n OTEL_TARGETS: z.string().default(\"\"),\n OTEL_CONSOLE_EXPORT: booleanFromEnv,\n OTEL_EXPORTER_OTLP_ENDPOINT: z.string().optional(),\n OTEL_EXPORTER_OTLP_HEADERS: z.string().optional(),\n LANGFUSE_BASE_URL: z.string().default(\"http://localhost:3000\"),\n LANGFUSE_PUBLIC_KEY: z.string().optional(),\n LANGFUSE_SECRET_KEY: z.string().optional(),\n PHOENIX_COLLECTOR_ENDPOINT: z.string().default(\"http://127.0.0.1:6006/v1/traces\"),\n PHOENIX_API_KEY: z.string().optional(),\n}).superRefine((value, issue) => {\n if (value.LEASE_DURATION_SECONDS <= 2 * value.HEARTBEAT_INTERVAL_SECONDS) {\n issue.addIssue({ code: \"custom\", path: [\"LEASE_DURATION_SECONDS\"],\n message: \"LEASE_DURATION_SECONDS must exceed twice HEARTBEAT_INTERVAL_SECONDS\" });\n }\n});\n\nconst raw = environmentSchema.parse(process.env);\n\nexport const settings = {\n ...raw,\n DATABASE_URL:\n raw.DATABASE_URL ??\n `postgresql://${encodeURIComponent(raw.POSTGRES_USER)}:${encodeURIComponent(raw.POSTGRES_PASSWORD)}@${raw.POSTGRES_HOST}:${raw.POSTGRES_PORT}/${raw.POSTGRES_DB}`,\n} as const;\n\nexport type Settings = typeof settings;\n",
6
+ "import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { settings } from \"./settings.ts\";\n\nconst corsSchema = z.object({\n allow_origins: z.array(z.string()).default([\"*\"]),\n allow_methods: z.array(z.string()).default([\"*\"]),\n allow_headers: z.array(z.string()).default([\"*\"]),\n allow_credentials: z.boolean().optional(),\n expose_headers: z.array(z.string()).default([\"Content-Location\", \"Location\"]),\n max_age: z.number().int().nonnegative().default(600),\n});\n\nconst configSchema = z.object({\n dependencies: z.array(z.string()).default([]),\n graphs: z.record(z.string(), z.string()).default({}),\n auth: z.object({ path: z.string(), disable_studio_auth: z.boolean().default(false) }).optional(),\n http: z\n .object({\n app: z.string().optional(),\n enable_custom_route_auth: z.boolean().default(false),\n cors: corsSchema.optional(),\n })\n .optional(),\n store: z\n .object({\n index: z\n .object({ dims: z.number().int().positive(), embed: z.string(), fields: z.array(z.string()).nullable().optional() })\n .nullable()\n .optional(),\n scopes: z.record(z.string(), z.array(z.string())).default({}),\n })\n .optional(),\n checkpointer: z\n .object({\n ttl: z\n .object({\n strategy: z.enum([\"delete\", \"keep_latest\"]).default(\"delete\"),\n default_ttl: z.number().positive().optional(),\n sweep_interval_minutes: z.number().positive().default(5),\n sweep_limit: z.number().int().positive().default(100),\n })\n .nullable()\n .optional(),\n })\n .optional(),\n});\n\nexport type AegraConfig = z.infer<typeof configSchema>;\n\nlet cachedConfig: AegraConfig | undefined;\n\nexport async function loadConfig(): Promise<AegraConfig> {\n if (cachedConfig) return cachedConfig;\n const configPath = resolve(settings.AEGRA_CONFIG);\n const content = await readFile(configPath, \"utf8\");\n cachedConfig = configSchema.parse(JSON.parse(content));\n return cachedConfig;\n}\n\nexport function configDirectory(): string {\n return dirname(resolve(settings.AEGRA_CONFIG));\n}\n\nexport function clearConfigCache(): void {\n cachedConfig = undefined;\n}\n",
7
+ "import { sql } from \"drizzle-orm\";\nimport { bigint, bigserial, boolean, doublePrecision, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unique, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport type { JsonObject, JsonValue } from \"../types.ts\";\n\nconst timestamps = {\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updated_at: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n};\n\nexport const migrations = pgTable(\"aegra_migrations\", {\n version: integer(\"version\").primaryKey(),\n applied_at: timestamp(\"applied_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const assistants = pgTable(\"assistant\", {\n assistant_id: text(\"assistant_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n graph_id: text(\"graph_id\").notNull(),\n config: jsonb(\"config\").$type<JsonObject>().notNull().default({}),\n context: jsonb(\"context\").$type<JsonObject>().notNull().default({}),\n user_id: text(\"user_id\").notNull(),\n version: integer(\"version\").notNull().default(1),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n ...timestamps,\n}, (table) => [\n index(\"idx_assistant_user\").on(table.user_id),\n unique(\"assistant_user_id_unique\").on(table.user_id, table.assistant_id),\n uniqueIndex(\"idx_assistant_user_graph_config\").on(table.user_id, table.graph_id, sql`md5(${table.config}::text)`),\n index(\"idx_assistant_metadata_gin\").using(\"gin\", sql`${table.metadata} jsonb_path_ops`),\n]);\n\nexport const assistantVersions = pgTable(\"assistant_versions\", {\n assistant_id: text(\"assistant_id\").notNull().references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n version: integer(\"version\").notNull(),\n graph_id: text(\"graph_id\").notNull(),\n config: jsonb(\"config\").$type<JsonObject>(),\n context: jsonb(\"context\").$type<JsonObject>(),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n name: text(\"name\"),\n description: text(\"description\"),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [primaryKey({ columns: [table.assistant_id, table.version] })]);\n\nexport const threads = pgTable(\"thread\", {\n thread_id: text(\"thread_id\").primaryKey(),\n status: text(\"status\").notNull().default(\"idle\"),\n metadata_json: jsonb(\"metadata_json\").$type<JsonObject>().notNull().default({}),\n user_id: text(\"user_id\").notNull(),\n ...timestamps,\n}, (table) => [index(\"idx_thread_user\").on(table.user_id),\n index(\"idx_thread_metadata_gin\").using(\"gin\", sql`${table.metadata_json} jsonb_path_ops`)]);\n\nexport const runs = pgTable(\"runs\", {\n run_id: text(\"run_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n thread_id: text(\"thread_id\").notNull().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n assistant_id: text(\"assistant_id\").references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n status: text(\"status\").notNull().default(\"pending\"),\n input: jsonb(\"input\").$type<JsonObject>(),\n config: jsonb(\"config\").$type<JsonObject>(),\n context: jsonb(\"context\").$type<JsonObject>(),\n output: jsonb(\"output\").$type<JsonObject>(),\n error_message: text(\"error_message\"),\n user_id: text(\"user_id\").notNull(),\n execution_params: jsonb(\"execution_params\").$type<JsonObject>(),\n claimed_by: text(\"claimed_by\"),\n lease_expires_at: timestamp(\"lease_expires_at\", { withTimezone: true }),\n ...timestamps,\n}, (table) => [\n index(\"idx_runs_thread_id\").on(table.thread_id), index(\"idx_runs_status\").on(table.status),\n index(\"idx_runs_user\").on(table.user_id), index(\"idx_runs_assistant_id\").on(table.assistant_id),\n index(\"idx_runs_created_at\").on(table.created_at),\n index(\"idx_runs_lease_reaper\").on(table.status, table.lease_expires_at).where(sql`${table.status} = 'running'`),\n]);\n\nexport const threadEvents = pgTable(\"thread_events\", {\n seq: bigserial(\"seq\", { mode: \"number\" }).primaryKey(),\n thread_id: text(\"thread_id\").notNull().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n run_id: text(\"run_id\").notNull().references(() => runs.run_id, { onDelete: \"cascade\" }),\n user_id: text(\"user_id\").notNull(),\n event_id: text(\"event_id\").notNull().unique(),\n method: text(\"method\").notNull(),\n namespace: text(\"namespace\").array().notNull().default(sql`'{}'::text[]`),\n event_data: jsonb(\"event_data\").$type<JsonValue>().notNull(),\n event_timestamp: bigint(\"event_timestamp\", { mode: \"number\" }).notNull(),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [index(\"idx_thread_events_replay\").on(table.user_id, table.thread_id, table.seq)]);\n\nexport const crons = pgTable(\"crons\", {\n cron_id: text(\"cron_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n assistant_id: text(\"assistant_id\").notNull().references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n thread_id: text(\"thread_id\").references(() => threads.thread_id, { onDelete: \"cascade\" }),\n user_id: text(\"user_id\").notNull(),\n schedule: text(\"schedule\").notNull(),\n payload: jsonb(\"payload\").$type<JsonObject>().notNull().default({}),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n on_run_completed: text(\"on_run_completed\"),\n enabled: boolean(\"enabled\").notNull().default(true),\n end_time: timestamp(\"end_time\", { withTimezone: true }),\n next_run_date: timestamp(\"next_run_date\", { withTimezone: true }),\n claimed_until: timestamp(\"claimed_until\", { withTimezone: true }),\n ...timestamps,\n}, (table) => [\n index(\"idx_cron_user\").on(table.user_id), index(\"idx_cron_assistant_id\").on(table.assistant_id),\n index(\"idx_cron_thread_id\").on(table.thread_id), index(\"idx_cron_next_run\").on(table.enabled, table.next_run_date),\n]);\n\nexport const storeItems = pgTable(\"store_items\", {\n user_id: text(\"user_id\").notNull(),\n namespace: text(\"namespace\").array().notNull(),\n key: text(\"key\").notNull(),\n value: jsonb(\"value\").$type<JsonObject>().notNull(),\n ...timestamps,\n}, (table) => [primaryKey({ columns: [table.namespace, table.key] })]);\n\nexport const threadTtl = pgTable(\"thread_ttl\", {\n thread_id: text(\"thread_id\").primaryKey().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n strategy: text(\"strategy\").notNull().default(\"delete\"),\n ttl_minutes: doublePrecision(\"ttl_minutes\").notNull(),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n expires_at: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n}, (table) => [index(\"idx_thread_ttl_expires_at\").on(table.expires_at)]);\n",
8
+ "import postgres from \"postgres\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport * as schema from \"./schema.ts\";\n\nexport const client = postgres(settings.DATABASE_URL, {\n max: 20,\n idle_timeout: 30,\n connect_timeout: 10,\n transform: { undefined: null },\n // Bootstrap DDL raises \"already exists\" notices on every boot; keep them only\n // in verbose mode so the structured request log stays readable.\n onnotice: (notice) => {\n if (settings.LOG_VERBOSITY !== \"verbose\") return;\n console.log(JSON.stringify({ event: \"postgres_notice\", severity: notice.severity, code: notice.code, message: notice.message }));\n },\n});\nexport const db = drizzle({ client, schema });\n\nconst migrations = [\n `CREATE TABLE IF NOT EXISTS aegra_migrations (\n version integer PRIMARY KEY,\n applied_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS assistant (\n assistant_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n name text NOT NULL,\n description text,\n graph_id text NOT NULL,\n config jsonb NOT NULL DEFAULT '{}'::jsonb,\n context jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n version integer NOT NULL DEFAULT 1,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE(user_id, assistant_id)\n )`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_assistant_user_graph_config\n ON assistant(user_id, graph_id, md5(config::text))`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_user ON assistant(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_metadata_gin ON assistant USING gin (metadata jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS assistant_versions (\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n version integer NOT NULL,\n graph_id text NOT NULL,\n config jsonb,\n context jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n name text,\n description text,\n created_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(assistant_id, version)\n )`,\n `CREATE TABLE IF NOT EXISTS thread (\n thread_id text PRIMARY KEY,\n status text NOT NULL DEFAULT 'idle',\n metadata_json jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_user ON thread(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_thread_metadata_gin ON thread USING gin (metadata_json jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS runs (\n run_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n assistant_id text REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'pending',\n input jsonb,\n config jsonb,\n context jsonb,\n output jsonb,\n error_message text,\n user_id text NOT NULL,\n execution_params jsonb,\n claimed_by text,\n lease_expires_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_user ON runs(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_assistant_id ON runs(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_created_at ON runs(created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_lease_reaper ON runs(status, lease_expires_at) WHERE status = 'running'`,\n `CREATE TABLE IF NOT EXISTS thread_events (\n seq bigserial PRIMARY KEY,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n run_id text NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n event_id text NOT NULL UNIQUE,\n method text NOT NULL,\n namespace text[] NOT NULL DEFAULT '{}',\n event_data jsonb NOT NULL,\n event_timestamp bigint NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_events_replay ON thread_events(user_id, thread_id, seq)`,\n `CREATE TABLE IF NOT EXISTS crons (\n cron_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n thread_id text REFERENCES thread(thread_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n schedule text NOT NULL,\n payload jsonb NOT NULL DEFAULT '{}'::jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n on_run_completed text,\n enabled boolean NOT NULL DEFAULT true,\n end_time timestamptz,\n next_run_date timestamptz,\n claimed_until timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS store_items (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n value jsonb NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(namespace, key)\n )`,\n // Store isolation lives in the namespace head ([\"users\", identity, ...]), so\n // the primary key must not include the writer. Older databases keyed on\n // user_id and are migrated in place; shared scopes otherwise duplicate rows.\n `DO $$\n DECLARE legacy_key boolean;\n BEGIN\n SELECT EXISTS (\n SELECT 1 FROM pg_constraint c\n JOIN pg_class t ON t.oid = c.conrelid\n WHERE t.relname = 'store_items' AND c.contype = 'p'\n AND pg_get_constraintdef(c.oid) = 'PRIMARY KEY (user_id, namespace, key)'\n ) INTO legacy_key;\n IF legacy_key THEN\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_user_id_namespace_key_fkey;\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_pkey;\n END IF;\n ALTER TABLE store_items DROP CONSTRAINT store_items_pkey;\n ALTER TABLE store_items ADD CONSTRAINT store_items_pkey PRIMARY KEY (namespace, key);\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_pkey PRIMARY KEY (namespace, key);\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_item_fkey\n FOREIGN KEY (namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE;\n END IF;\n END IF;\n END $$`,\n `CREATE INDEX IF NOT EXISTS idx_cron_user ON crons(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_assistant_id ON crons(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_thread_id ON crons(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_next_run ON crons(enabled, next_run_date)`,\n `CREATE TABLE IF NOT EXISTS thread_ttl (\n thread_id text PRIMARY KEY REFERENCES thread(thread_id) ON DELETE CASCADE,\n strategy text NOT NULL DEFAULT 'delete',\n ttl_minutes double precision NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n expires_at timestamptz NOT NULL\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_ttl_expires_at ON thread_ttl(expires_at)`,\n];\n\nexport async function migrate(): Promise<void> {\n for (const statement of migrations) await client.unsafe(statement);\n if ((await loadConfig()).store?.index) {\n await client.unsafe(\"CREATE EXTENSION IF NOT EXISTS vector\");\n await client.unsafe(`CREATE TABLE IF NOT EXISTS store_embeddings (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n embedding vector NOT NULL,\n PRIMARY KEY(namespace, key),\n FOREIGN KEY(namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE\n )`);\n }\n}\n\nexport async function pingDatabase(): Promise<boolean> {\n try {\n await client`SELECT 1`;\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function closeDatabase(): Promise<void> {\n await client.end({ timeout: 5 });\n}\n",
9
+ "import type { AuthUser, JsonObject } from \"./types.ts\";\n\nexport interface AuthorizationContext {\n user: AuthUser;\n resource: string;\n action: string;\n permissions: string[];\n}\n\nexport type AuthenticateHandler = (request: Request) => AuthUser | Promise<AuthUser>;\nexport type AuthorizationHandler = (\n context: AuthorizationContext,\n value: JsonObject,\n) => boolean | JsonObject | void | Promise<boolean | JsonObject | void>;\n\nexport class Auth {\n authenticateHandler?: AuthenticateHandler;\n readonly handlers = new Map<string, AuthorizationHandler>();\n\n authenticate(handler: AuthenticateHandler): AuthenticateHandler {\n this.authenticateHandler = handler;\n return handler;\n }\n\n on(resource: string, action: string, handler: AuthorizationHandler): AuthorizationHandler {\n this.handlers.set(`${resource}:${action}`, handler);\n return handler;\n }\n\n handler(resource: string, action: string): AuthorizationHandler | undefined {\n return this.handlers.get(`${resource}:${action}`)\n ?? this.handlers.get(`${resource}:*`)\n ?? this.handlers.get(`*:${action}`)\n ?? this.handlers.get(\"*:*\");\n }\n}\n",
10
+ "import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { prometheus } from \"@hono/prometheus\";\nimport { settings } from \"./config/settings.ts\";\nimport { loadConfig } from \"./config/project.ts\";\nimport { ApiError, errorBody } from \"./core/errors.ts\";\nimport type { AegraApp } from \"./hono.ts\";\nimport { loadModuleExport } from \"./module-loader.ts\";\nimport { authMiddleware, initializeAuth } from \"./middleware/auth.ts\";\nimport { requestContextMiddleware } from \"./middleware/request-context.ts\";\nimport { assistantRoutes } from \"./routes/assistants.ts\";\nimport { cronRoutes } from \"./routes/crons.ts\";\nimport { docsRoutes } from \"./routes/docs.ts\";\nimport { eventRoutes } from \"./routes/events.ts\";\nimport { healthRoutes } from \"./routes/health.ts\";\nimport { runRoutes } from \"./routes/runs.ts\";\nimport { storeRoutes } from \"./routes/store.ts\";\nimport { threadRoutes } from \"./routes/threads.ts\";\nimport type { AppVariables } from \"./types.ts\";\n\nexport async function createApp(): Promise<Hono<{ Variables: AppVariables }>> {\n const config = await loadConfig();\n await initializeAuth();\n const app = new Hono<{ Variables: AppVariables }>();\n const corsConfig = config.http?.cors;\n app.use(\"*\", cors({\n origin: corsConfig?.allow_origins ?? \"*\",\n allowMethods: corsConfig?.allow_methods ?? [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"],\n allowHeaders: corsConfig?.allow_headers ?? [\"*\"],\n exposeHeaders: corsConfig?.expose_headers ?? [\"Content-Location\", \"Location\"],\n credentials: corsConfig?.allow_credentials ?? false,\n maxAge: corsConfig?.max_age ?? 600,\n }));\n app.use(\"*\", requestContextMiddleware);\n\n if (settings.ENABLE_PROMETHEUS_METRICS) {\n const { printMetrics, registerMetrics } = prometheus();\n app.use(\"*\", registerMetrics);\n app.get(\"/metrics\", printMetrics);\n }\n\n app.route(\"/\", healthRoutes);\n // FastAPI parity: docs and the raw spec stay public, outside the authenticated group.\n app.route(\"/\", docsRoutes);\n const api = new Hono<{ Variables: AppVariables }>();\n api.use(\"*\", authMiddleware);\n api.route(\"/\", assistantRoutes);\n api.route(\"/\", threadRoutes);\n api.route(\"/\", runRoutes);\n api.route(\"/\", cronRoutes);\n api.route(\"/\", storeRoutes);\n api.route(\"/\", eventRoutes);\n app.route(\"/\", api);\n\n if (config.http?.app) {\n const custom = await loadCustomApp(config.http.app);\n if (config.http.enable_custom_route_auth) {\n const authenticated = new Hono<{ Variables: AppVariables }>();\n authenticated.use(\"*\", authMiddleware);\n authenticated.route(\"/\", custom);\n app.route(\"/\", authenticated);\n } else {\n app.route(\"/\", custom);\n }\n }\n\n app.get(\"/\", (context) => context.json({ message: settings.PROJECT_NAME, version: settings.VERSION, status: \"running\" }));\n app.notFound((context) => context.json(errorBody(new ApiError(404, \"Route not found\")), 404));\n app.onError((error, context) => {\n if (error instanceof ApiError) return context.json(errorBody(error), error.status as 400);\n console.error(error);\n return context.json({ error: \"internal_error\", message: \"An unexpected error occurred\", details: null }, 500);\n });\n return app;\n}\n\nexport async function loadCustomApp(path: string): Promise<AegraApp> {\n const { exported, modulePath, exportName } = await loadModuleExport(path, {\n defaultExport: \"app\",\n kind: \"Hono app\",\n pythonMessage: \"Python custom apps are unsupported; migrate the app to Hono\",\n });\n if (!exported || typeof exported !== \"object\" || typeof (exported as { fetch?: unknown }).fetch !== \"function\") {\n throw new Error(`Hono app export '${exportName}' in ${modulePath} must provide a fetch handler`);\n }\n return exported as AegraApp;\n}\n",
11
+ "export class ApiError extends Error {\n public constructor(\n public readonly status: number,\n message: string,\n public readonly details: unknown = null,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nconst errorNames: Record<number, string> = {\n 400: \"bad_request\",\n 401: \"unauthorized\",\n 403: \"forbidden\",\n 404: \"not_found\",\n 409: \"conflict\",\n 422: \"validation_error\",\n 503: \"service_unavailable\",\n};\n\nexport function errorBody(error: ApiError): { error: string; message: string; details: unknown } {\n return {\n error: errorNames[error.status] ?? \"internal_error\",\n message: error.message,\n details: error.details,\n };\n}\n",
12
+ "import { isAbsolute, resolve } from \"node:path\";\nimport { configDirectory } from \"./config/project.ts\";\n\nexport interface ModuleReference {\n modulePath: string;\n exportName: string;\n}\n\nexport function parseModuleReference(reference: string, defaultExport: string): ModuleReference {\n const separator = reference.lastIndexOf(\":\");\n const modulePath = separator < 0 ? reference : reference.slice(0, separator);\n const exportName = separator < 0 ? defaultExport : reference.slice(separator + 1);\n if (!modulePath) throw new Error(\"Module path cannot be empty\");\n if (!exportName) throw new Error(`Export name cannot be empty in '${reference}'`);\n return { modulePath, exportName };\n}\n\nfunction isFileSpecifier(modulePath: string): boolean {\n return modulePath.startsWith(\".\") || modulePath.startsWith(\"/\") || isAbsolute(modulePath);\n}\n\nexport async function loadModuleExport(\n reference: string,\n options: { defaultExport: string; kind: string; pythonMessage: string },\n): Promise<{ exported: unknown; modulePath: string; exportName: string }> {\n const { modulePath, exportName } = parseModuleReference(reference, options.defaultExport);\n if (modulePath.endsWith(\".py\")) throw new Error(options.pythonMessage);\n const resolved = isFileSpecifier(modulePath)\n ? resolve(configDirectory(), modulePath)\n : Bun.resolveSync(modulePath, configDirectory());\n let loaded: Record<string, unknown>;\n try {\n loaded = await import(Bun.pathToFileURL(resolved).href) as Record<string, unknown>;\n } catch (error) {\n throw new Error(`Failed to load ${options.kind} module '${modulePath}' from ${resolved}`, { cause: error });\n }\n if (!(exportName in loaded)) {\n throw new Error(`${options.kind} export '${exportName}' was not found in ${modulePath}`);\n }\n return { exported: loaded[exportName], modulePath, exportName };\n}\n",
13
+ "import type { Context, MiddlewareHandler } from \"hono\";\nimport { Auth, type AuthenticateHandler, type AuthorizationHandler } from \"../auth.ts\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { asJsonObject } from \"../core/validation.ts\";\nimport { loadModuleExport } from \"../module-loader.ts\";\nimport type { AppVariables, AuthUser, JsonObject } from \"../types.ts\";\n\nconst anonymousUser: AuthUser = { identity: \"anonymous\", isAuthenticated: false, permissions: [] };\nlet authenticate: AuthenticateHandler | undefined;\nlet authorizationHandler: ((resource: string, action: string) => AuthorizationHandler | undefined) | undefined;\n\nexport async function initializeAuth(): Promise<void> {\n authenticate = undefined;\n authorizationHandler = undefined;\n const configured = (await loadConfig()).auth?.path;\n if (!configured) return;\n const { exported, modulePath, exportName } = await loadModuleExport(configured, {\n defaultExport: \"authenticate\",\n kind: \"Auth\",\n pythonMessage: \"Python auth handlers are unsupported; migrate the handler to TypeScript\",\n });\n if (typeof exported === \"function\") {\n authenticate = exported as AuthenticateHandler;\n return;\n }\n if (exported instanceof Auth) {\n authenticate = exported.authenticateHandler;\n authorizationHandler = (resource, action) => exported.handler(resource, action);\n } else if (exported && typeof exported === \"object\") {\n const object = exported as { authenticate?: unknown; authorize?: unknown };\n if (object.authenticate !== undefined && typeof object.authenticate !== \"function\") {\n throw new Error(`Auth export '${exportName}' in ${modulePath} has a non-function authenticate handler`);\n }\n if (object.authorize !== undefined && typeof object.authorize !== \"function\") {\n throw new Error(`Auth export '${exportName}' in ${modulePath} has a non-function authorize handler`);\n }\n authenticate = object.authenticate as AuthenticateHandler | undefined;\n authorizationHandler = object.authorize\n ? () => object.authorize as AuthorizationHandler\n : undefined;\n }\n if (!authenticate) throw new Error(`Auth export '${exportName}' in ${modulePath} must provide an authenticate handler`);\n}\n\nexport function authorizationEvent(method: string, path: string): [string, string] | undefined {\n const segments = path.split(\"/\").filter(Boolean);\n if (segments[0] === \"assistants\") {\n if (segments.length === 1) return [\"assistants\", method === \"POST\" ? \"create\" : \"search\"];\n if (segments[1] === \"search\" || segments[1] === \"count\") return [\"assistants\", \"search\"];\n if (segments[2] === \"latest\") return [\"assistants\", \"update\"];\n if ([\"versions\", \"schemas\", \"graph\", \"subgraphs\"].includes(segments[2] ?? \"\")) return [\"assistants\", \"read\"];\n return [\"assistants\", method === \"PATCH\" ? \"update\" : method === \"DELETE\" ? \"delete\" : \"read\"];\n }\n if (segments[0] === \"store\") {\n if (segments[1] === \"namespaces\") return [\"store\", \"list_namespaces\"];\n return [\"store\", method === \"PUT\" ? \"put\" : method === \"GET\" ? \"get\" : method === \"DELETE\" ? \"delete\" : \"search\"];\n }\n if ((segments[0] === \"runs\" && segments[1] === \"crons\") || segments.includes(\"crons\")) {\n return [\"crons\", method === \"PATCH\" ? \"update\" : method === \"DELETE\" ? \"delete\"\n : segments.at(-1) === \"search\" || segments.at(-1) === \"count\" ? \"search\" : \"create\"];\n }\n if (segments[0] === \"runs\") return [\"threads\", \"create_run\"];\n if (segments[0] !== \"threads\") return undefined;\n if (segments.length === 1) return [\"threads\", method === \"POST\" ? \"create\" : \"search\"];\n if (segments[1] === \"search\") return [\"threads\", \"search\"];\n if (segments[1] === \"prune\") return [\"threads\", \"delete\"];\n if (segments[2] === \"commands\") return [\"threads\", \"create_run\"];\n if (segments[2] === \"stream\") return [\"threads\", \"read\"];\n if (segments[2] === \"history\") return [\"threads\", \"read\"];\n if (segments[2] === \"state\") return [\"threads\", segments[3] === \"checkpoint\" || method === \"GET\" ? \"read\" : \"update\"];\n if (segments[2] === \"runs\") {\n if (segments.length === 3) return [\"threads\", method === \"GET\" ? \"search\" : \"create_run\"];\n if ([\"stream\", \"wait\"].includes(segments[3] ?? \"\")) return [\"threads\", \"create_run\"];\n if (segments[4] === \"cancel\" || method === \"PATCH\") return [\"threads\", \"update\"];\n return [\"threads\", method === \"DELETE\" ? \"delete\" : \"read\"];\n }\n return [\"threads\", method === \"PATCH\" ? \"update\" : method === \"DELETE\" ? \"delete\" : \"read\"];\n}\n\nfunction pathValues(path: string): JsonObject {\n const segments = path.split(\"/\").filter(Boolean);\n const values: JsonObject = {};\n if (segments[0] === \"assistants\" && segments[1] && ![\"search\", \"count\"].includes(segments[1])) values.assistant_id = segments[1];\n if (segments[0] === \"threads\" && segments[1] && ![\"search\", \"prune\"].includes(segments[1])) values.thread_id = segments[1];\n const runIndex = segments.indexOf(\"runs\");\n const runId = segments[runIndex + 1];\n if (runIndex >= 0 && runId && runId !== \"crons\") values.run_id = runId;\n const cronIndex = segments.indexOf(\"crons\");\n const cronId = segments[cronIndex + 1];\n if (cronIndex >= 0 && cronId && ![\"search\", \"count\"].includes(cronId)) values.cron_id = cronId;\n return values;\n}\n\nexport async function authorizeResource(\n context: Context<{ Variables: AppVariables }>, resource: string, action: string, value: JsonObject,\n): Promise<JsonObject> {\n const handler = authorizationHandler?.(resource, action);\n if (!handler) return value;\n const user = context.get(\"user\");\n const result = await handler({ user, resource, action, permissions: user.permissions }, value);\n if (result === false) throw new ApiError(403, \"Forbidden\");\n if (result !== undefined && result !== true && (typeof result !== \"object\" || Array.isArray(result) || result === null)) {\n throw new Error(\"Authorization handlers must return an object, true, false, or undefined\");\n }\n return result && typeof result === \"object\" ? { ...value, ...result } : value;\n}\n\nasync function authorize(context: Context<{ Variables: AppVariables }>): Promise<void> {\n const event = authorizationEvent(context.req.method, context.req.path);\n if (!event) {\n context.set(\"authorizationValue\", {});\n return;\n }\n let body: JsonObject = {};\n if (![\"GET\", \"HEAD\"].includes(context.req.method)) {\n try { body = asJsonObject(await context.req.json()); } catch { /* validation owns malformed bodies */ }\n }\n const query = Object.fromEntries(new URL(context.req.url).searchParams) as JsonObject;\n const value = { ...query, ...body, ...pathValues(context.req.path) };\n const [resource, action] = event;\n context.set(\"authorizationValue\", await authorizeResource(context, resource, action, value));\n}\n\nexport const authMiddleware: MiddlewareHandler<{ Variables: AppVariables }> = async (context, next) => {\n if (!authenticate) {\n context.set(\"user\", anonymousUser);\n context.set(\"authorizationValue\", {});\n await next();\n return;\n }\n let result: AuthUser;\n try { result = await authenticate(context.req.raw); }\n catch { throw new ApiError(401, \"Authentication failed\"); }\n if (!result || result.isAuthenticated === false || typeof result.identity !== \"string\" || !result.identity) {\n throw new ApiError(401, \"Authentication failed\");\n }\n const user: AuthUser = {\n ...result,\n identity: result.identity,\n isAuthenticated: result.isAuthenticated ?? true,\n permissions: Array.isArray(result.permissions) ? result.permissions.map(String) : [],\n };\n context.set(\"user\", user);\n await authorize(context);\n await next();\n};\n",
14
+ "import type { Context } from \"hono\";\nimport { z } from \"zod\";\nimport { ApiError } from \"../core/errors.ts\";\nimport type { AppVariables, JsonObject, JsonValue } from \"../types.ts\";\n\nexport const jsonObjectSchema: z.ZodType<JsonObject> = z.record(z.string(), z.json()) as z.ZodType<JsonObject>;\n\nexport function getAuthorizationValue(context: Context<{ Variables: AppVariables }>): JsonObject {\n return context.get(\"authorizationValue\") ?? {};\n}\n\nexport async function parseJson<T>(context: Context<{ Variables: AppVariables }>, schema: z.ZodType<T>): Promise<T> {\n let body: unknown;\n try {\n body = await context.req.json();\n } catch {\n throw new ApiError(422, \"Request body must be valid JSON\");\n }\n const authorized = getAuthorizationValue(context);\n if (!Object.keys(authorized).length) return parseValue(body, schema);\n const request = asJsonObject(body);\n const merged = { ...request, ...authorized };\n for (const key of [\"metadata\", \"config\", \"context\", \"filter\"] as const) {\n if (request[key] && authorized[key]) {\n merged[key] = { ...asJsonObject(request[key]), ...asJsonObject(authorized[key]) };\n }\n }\n return parseValue(merged, schema);\n}\n\nexport function parseValue<T>(value: unknown, schema: z.ZodType<T>): T {\n const result = schema.safeParse(value);\n if (!result.success) throw new ApiError(422, \"Request validation failed\", result.error.issues);\n return result.data;\n}\n\nexport function asJsonObject(value: unknown): JsonObject {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return {};\n return value as JsonObject;\n}\n\nexport function asJsonValue(value: unknown): JsonValue {\n return JSON.parse(JSON.stringify(value ?? null)) as JsonValue;\n}\n\nexport function initialThreadMetadata(userId: string, metadata: JsonObject = {}): JsonObject {\n return { assistant_id: null, graph_id: null, thread_name: \"\", ...metadata, owner: userId };\n}\n\n/**\n * Metadata injected by an authorization handler.\n *\n * Handlers scope tenants by returning (or mutating in place) `metadata`, so\n * create and update routes merge it over the request body's metadata.\n */\nexport function authorizedMetadata(context: Context): JsonObject {\n return asJsonObject(getAuthorizationValue(context).metadata);\n}\n\nexport function clampLimit(value: string | number | null | undefined, fallback = 20, maximum = 1000): number {\n const parsed = typeof value === \"number\" ? value : Number(value ?? fallback);\n if (!Number.isInteger(parsed) || parsed < 1) throw new ApiError(422, \"limit must be a positive integer\");\n if (parsed > maximum) throw new ApiError(422, `limit must be at most ${maximum}`);\n return parsed;\n}\n\nexport function parseOffset(value: string | number | null | undefined): number {\n const parsed = typeof value === \"number\" ? value : Number(value ?? 0);\n if (!Number.isInteger(parsed) || parsed < 0) throw new ApiError(422, \"offset must be a non-negative integer\");\n return parsed;\n}\n",
15
+ "import type { MiddlewareHandler } from \"hono\";\nimport { settings } from \"../config/settings.ts\";\nimport type { AppVariables } from \"../types.ts\";\n\nexport const requestContextMiddleware: MiddlewareHandler<{ Variables: AppVariables }> = async (context, next) => {\n const startedAt = performance.now();\n const requestId = context.req.header(\"x-request-id\") ?? crypto.randomUUID();\n context.set(\"requestId\", requestId);\n context.header(\"x-request-id\", requestId);\n await next();\n const excluded = settings.LOG_EXCLUDE_PATHS.split(\",\").some((prefix) => prefix.trim() && context.req.path.startsWith(prefix.trim()));\n if (context.res.status >= 400 || !excluded) {\n console.log(\n JSON.stringify({\n event: \"request\",\n ...(settings.LOG_VERBOSITY === \"verbose\" ? { request_id: requestId } : {}),\n method: context.req.method,\n path: context.req.path,\n status: context.res.status,\n duration_ms: Number((performance.now() - startedAt).toFixed(2)),\n }),\n );\n }\n};\n",
16
+ "import { Hono, type Context } from \"hono\";\nimport { getJsonSchemaFromSchema } from \"@langchain/langgraph\";\nimport { and, asc, desc, eq, ilike, inArray, or, sql, type SQL } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { db } from \"../core/database.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { assistants, assistantVersions } from \"../core/schema.ts\";\nimport { asJsonObject, authorizedMetadata, getAuthorizationValue, jsonObjectSchema, parseJson } from \"../core/validation.ts\";\nimport { getGraph, type RunnableGraph } from \"../services/graph-registry.ts\";\nimport type { AppVariables, AssistantRecord } from \"../types.ts\";\n\nconst createSchema = z.object({\n assistant_id: z.string().min(1).optional(),\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n graph_id: z.string().min(1),\n config: jsonObjectSchema.nullable().default({}),\n context: jsonObjectSchema.nullable().default({}),\n metadata: jsonObjectSchema.nullable().default({}),\n if_exists: z.enum([\"error\", \"do_nothing\"]).default(\"error\"),\n});\n\nconst updateSchema = z.object({\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n graph_id: z.string().min(1).optional(),\n config: jsonObjectSchema.nullable().optional(),\n context: jsonObjectSchema.nullable().optional(),\n metadata: jsonObjectSchema.nullable().optional(),\n});\n\nconst searchSchema = z.object({\n name: z.string().optional(),\n description: z.string().optional(),\n graph_id: z.string().optional(),\n limit: z.number().int().positive().max(100).nullable().default(20),\n offset: z.number().int().nonnegative().nullable().default(0),\n metadata: jsonObjectSchema.nullable().default({}),\n sort_by: z.enum([\"assistant_id\", \"name\", \"graph_id\", \"created_at\", \"updated_at\"]).nullable().optional(),\n sort_order: z.enum([\"asc\", \"desc\"]).nullable().optional(),\n});\n\nfunction assistant(row: Record<string, unknown>): AssistantRecord {\n return {\n assistant_id: String(row.assistant_id),\n name: String(row.name),\n description: row.description === null ? null : String(row.description),\n graph_id: String(row.graph_id),\n config: asJsonObject(row.config),\n context: asJsonObject(row.context),\n user_id: String(row.user_id),\n version: Number(row.version),\n metadata: asJsonObject(row.metadata),\n created_at: new Date(String(row.created_at)).toISOString(),\n updated_at: new Date(String(row.updated_at)).toISOString(),\n };\n}\n\nfunction likePattern(value?: string): string | null {\n return value ? `%${value.replace(/[\\\\%_]/g, \"\\\\$&\")}%` : null;\n}\n\nfunction authorizationFilters(context: Context<{ Variables: AppVariables }>): SQL[] {\n const value = getAuthorizationValue(context);\n const metadata = asJsonObject(value.metadata);\n return [\n typeof value.assistant_id === \"string\" ? eq(assistants.assistant_id, value.assistant_id) : undefined,\n typeof value.graph_id === \"string\" ? eq(assistants.graph_id, value.graph_id) : undefined,\n Object.keys(metadata).length ? sql`${assistants.metadata} @> ${JSON.stringify(metadata)}::jsonb` : undefined,\n ].filter((filter): filter is SQL => filter !== undefined);\n}\n\nfunction inferType(value: unknown): Record<string, unknown> {\n if (Array.isArray(value)) return { type: \"array\", items: {} };\n if (typeof value === \"number\") return { type: \"number\" };\n if (typeof value === \"boolean\") return { type: \"boolean\" };\n if (typeof value === \"string\") return { type: \"string\" };\n if (value && typeof value === \"object\") return { type: \"object\" };\n return {};\n}\n\nfunction definitionProperties(definition: unknown): Record<string, unknown> {\n if (!definition || typeof definition !== \"object\") return {};\n const record = definition as Record<string, unknown>;\n // Annotation.Root exposes channel specs; plain state definitions are channel maps.\n const channels = asJsonObject((record.spec ?? record) as unknown);\n return Object.fromEntries(Object.entries(channels).map(([key, channel]) => {\n const value = asJsonObject(channel).value ?? channel;\n return [key, inferType(value)];\n }));\n}\n\nfunction jsonSchema(runtime: unknown, definition: unknown, input = false): Record<string, unknown> {\n if (runtime && typeof runtime === \"object\") {\n const source = runtime as { getJsonSchema?: () => unknown; getInputJsonSchema?: () => unknown };\n const method = input ? source.getInputJsonSchema : source.getJsonSchema;\n if (method) {\n const schema = asJsonObject(method.call(source));\n if (Object.keys(schema).length) return schema;\n }\n const standard = getJsonSchemaFromSchema(runtime as Parameters<typeof getJsonSchemaFromSchema>[0]);\n if (standard && Object.keys(asJsonObject(standard)).length) return asJsonObject(standard);\n }\n return { type: \"object\", properties: definitionProperties(definition) };\n}\n\nexport function graphSchemas(graph: RunnableGraph): Record<string, unknown> {\n const builder = graph.builder;\n return {\n input_schema: jsonSchema(builder?._inputRuntimeDefinition, builder?._inputDefinition, true),\n output_schema: jsonSchema(builder?._outputRuntimeDefinition, builder?._outputDefinition),\n state_schema: jsonSchema(builder?._schemaRuntimeDefinition, builder?._schemaDefinition),\n config_schema: jsonSchema(builder?._configRuntimeSchema, builder?._configSchema),\n };\n}\n\nexport const assistantRoutes = new Hono<{ Variables: AppVariables }>();\n\nassistantRoutes.post(\"/assistants\", async (context) => {\n const body = await parseJson(context, createSchema);\n const userId = context.get(\"user\").identity;\n const assistantId = body.assistant_id ?? crypto.randomUUID();\n const name = body.name ?? `Assistant for ${body.graph_id}`;\n await getGraph(body.graph_id, { user: context.get(\"user\"), context: body.context, accessContext: \"assistants.read\" });\n const created = await db.transaction(async (transaction) => {\n const rows = await transaction.insert(assistants).values({\n assistant_id: assistantId, name, description: body.description ?? null, graph_id: body.graph_id,\n config: body.config ?? {}, context: body.context ?? {}, user_id: userId,\n metadata: { ...(body.metadata ?? {}), ...authorizedMetadata(context) },\n }).onConflictDoNothing().returning();\n if (!rows[0]) return undefined;\n const record = assistant(rows[0]);\n await transaction.insert(assistantVersions).values({\n assistant_id: record.assistant_id, version: 1, graph_id: record.graph_id, config: record.config,\n context: record.context, metadata: record.metadata, name: record.name, description: record.description,\n });\n return record;\n });\n if (!created) {\n const existing = await db.select().from(assistants).where(and(eq(assistants.user_id, userId), or(\n eq(assistants.assistant_id, assistantId),\n and(eq(assistants.graph_id, body.graph_id), eq(assistants.config, body.config ?? {})),\n ))).limit(1);\n if (existing[0] && body.if_exists === \"do_nothing\") return context.json(assistant(existing[0]));\n throw new ApiError(409, \"Assistant already exists\");\n }\n return context.json(created);\n});\n\nassistantRoutes.get(\"/assistants\", async (context) => {\n const userId = context.get(\"user\").identity;\n const filters = authorizationFilters(context);\n const rows = await db.select().from(assistants).where(and(inArray(assistants.user_id, [userId, \"system\"]), ...filters))\n .orderBy(desc(assistants.created_at));\n return context.json({ assistants: rows.map((row) => assistant(row)), total: rows.length });\n});\n\nassistantRoutes.post(\"/assistants/search\", async (context) => {\n const body = await parseJson(context, searchSchema);\n const userId = context.get(\"user\").identity;\n const filters = [\n inArray(assistants.user_id, [userId, \"system\"]),\n body.name ? ilike(assistants.name, likePattern(body.name)!) : undefined,\n body.description ? ilike(assistants.description, likePattern(body.description)!) : undefined,\n body.graph_id ? eq(assistants.graph_id, body.graph_id) : undefined,\n sql`${assistants.metadata} @> ${JSON.stringify(body.metadata ?? {})}::jsonb`,\n ];\n const orderField = assistants[body.sort_by ?? \"created_at\"];\n const rows = await db.select().from(assistants).where(and(...filters))\n .orderBy(body.sort_order === \"asc\" ? asc(orderField) : desc(orderField))\n .limit(body.limit ?? 20).offset(body.offset ?? 0);\n return context.json(rows.map((row) => assistant(row)));\n});\n\nassistantRoutes.post(\"/assistants/count\", async (context) => {\n const body = await parseJson(context, searchSchema.partial());\n const userId = context.get(\"user\").identity;\n const rows = await db.select({ count: sql<number>`count(*)::int` }).from(assistants).where(and(\n inArray(assistants.user_id, [userId, \"system\"]),\n body.name ? ilike(assistants.name, likePattern(body.name)!) : undefined,\n body.description ? ilike(assistants.description, likePattern(body.description)!) : undefined,\n body.graph_id ? eq(assistants.graph_id, body.graph_id) : undefined,\n sql`${assistants.metadata} @> ${JSON.stringify(body.metadata ?? {})}::jsonb`,\n ));\n return context.json(Number(rows[0]?.count ?? 0));\n});\n\nassistantRoutes.get(\"/assistants/:assistantId\", async (context) => {\n const rows = await db.select().from(assistants).where(and(eq(assistants.assistant_id, context.req.param(\"assistantId\")),\n inArray(assistants.user_id, [context.get(\"user\").identity, \"system\"]), ...authorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n return context.json(assistant(rows[0]));\n});\n\nassistantRoutes.patch(\"/assistants/:assistantId\", async (context) => {\n const body = await parseJson(context, updateSchema);\n const id = context.req.param(\"assistantId\");\n const userId = context.get(\"user\").identity;\n if (body.graph_id) await getGraph(body.graph_id, { user: context.get(\"user\"),\n ...(body.context !== undefined ? { context: body.context } : {}), accessContext: \"assistants.read\" });\n const updated = await db.transaction(async (transaction) => {\n const currentRows = await transaction.select().from(assistants)\n .where(and(eq(assistants.assistant_id, id), eq(assistants.user_id, userId), ...authorizationFilters(context))).for(\"update\").limit(1);\n if (!currentRows[0]) return undefined;\n const current = assistant(currentRows[0]);\n const nextVersion = current.version + 1;\n const values = {\n name: body.name === undefined ? current.name : body.name ?? current.name,\n description: body.description === undefined ? current.description : body.description,\n graphId: body.graph_id ?? current.graph_id,\n config: body.config ?? current.config,\n context: body.context ?? current.context,\n metadata: { ...(body.metadata ?? current.metadata), ...authorizedMetadata(context) },\n };\n const rows = await transaction.update(assistants).set({\n name: values.name, description: values.description, graph_id: values.graphId, config: values.config,\n context: values.context, metadata: values.metadata, version: nextVersion, updated_at: new Date(),\n }).where(and(eq(assistants.assistant_id, id), eq(assistants.user_id, userId))).returning();\n const record = assistant(rows[0] as Record<string, unknown>);\n await transaction.insert(assistantVersions).values({ assistant_id: id, version: nextVersion, graph_id: record.graph_id,\n config: record.config, context: record.context, metadata: record.metadata, name: record.name, description: record.description });\n return record;\n });\n if (!updated) throw new ApiError(404, \"Assistant not found\");\n return context.json(updated);\n});\n\nassistantRoutes.delete(\"/assistants/:assistantId\", async (context) => {\n const rows = await db.delete(assistants).where(and(eq(assistants.assistant_id, context.req.param(\"assistantId\")),\n eq(assistants.user_id, context.get(\"user\").identity), ...authorizationFilters(context))).returning({ assistant_id: assistants.assistant_id });\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n return context.json({ status: \"deleted\" });\n});\n\nassistantRoutes.post(\"/assistants/:assistantId/versions\", async (context) => {\n const id = context.req.param(\"assistantId\");\n const userId = context.get(\"user\").identity;\n const owned = await db.select({ assistant_id: assistants.assistant_id }).from(assistants)\n .where(and(eq(assistants.assistant_id, id), inArray(assistants.user_id, [userId, \"system\"]), ...authorizationFilters(context))).limit(1);\n if (!owned[0]) throw new ApiError(404, \"Assistant not found\");\n const rows = await db.select().from(assistantVersions).where(eq(assistantVersions.assistant_id, id))\n .orderBy(desc(assistantVersions.version));\n return context.json(rows.map((row) => assistant({ ...row, user_id: userId, updated_at: row.created_at })));\n});\n\nassistantRoutes.post(\"/assistants/:assistantId/latest\", async (context) => {\n const body = await parseJson(context, z.object({ version: z.number().int().positive() }));\n const id = context.req.param(\"assistantId\");\n const userId = context.get(\"user\").identity;\n const rows = await db.transaction(async (transaction) => {\n const owned = await transaction.select({ assistant_id: assistants.assistant_id }).from(assistants)\n .where(and(eq(assistants.assistant_id, id), eq(assistants.user_id, userId), ...authorizationFilters(context))).for(\"update\").limit(1);\n if (!owned[0]) return [];\n const version = await transaction.select().from(assistantVersions).where(and(eq(assistantVersions.assistant_id, id),\n eq(assistantVersions.version, body.version))).limit(1);\n if (!version[0]) return [];\n return transaction.update(assistants).set({ graph_id: version[0].graph_id, config: version[0].config ?? {},\n context: version[0].context ?? {}, metadata: version[0].metadata,\n ...(version[0].name !== null ? { name: version[0].name } : {}), description: version[0].description,\n version: version[0].version, updated_at: new Date() })\n .where(and(eq(assistants.assistant_id, id), eq(assistants.user_id, userId))).returning();\n });\n if (!rows[0]) throw new ApiError(404, \"Assistant version not found\");\n return context.json(assistant(rows[0]));\n});\n\nassistantRoutes.get(\"/assistants/:assistantId/schemas\", async (context) => {\n const rows = await db.select().from(assistants).where(and(eq(assistants.assistant_id, context.req.param(\"assistantId\")),\n inArray(assistants.user_id, [context.get(\"user\").identity, \"system\"]), ...authorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n const record = assistant(rows[0]);\n const graph = await getGraph(record.graph_id, { user: context.get(\"user\"), accessContext: \"assistants.read\" });\n return context.json(graphSchemas(graph));\n});\n\nassistantRoutes.get(\"/assistants/:assistantId/graph\", async (context) => {\n const rows = await db.select().from(assistants).where(and(eq(assistants.assistant_id, context.req.param(\"assistantId\")),\n inArray(assistants.user_id, [context.get(\"user\").identity, \"system\"]), ...authorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n const record = assistant(rows[0]);\n const graph = await getGraph(record.graph_id, { user: context.get(\"user\"), accessContext: \"assistants.read\" });\n const xrayRaw = context.req.query(\"xray\");\n const xray = xrayRaw === undefined ? false : xrayRaw === \"true\" ? true : xrayRaw === \"false\" ? false : Number(xrayRaw);\n if (typeof xray === \"number\" && (!Number.isInteger(xray) || xray <= 0)) throw new ApiError(422, \"Invalid xray value\");\n const drawable = graph.getGraphAsync ? await graph.getGraphAsync({ xray }) : undefined;\n return context.json(drawable?.toJSON() ?? {});\n});\n\nassistantRoutes.get(\"/assistants/:assistantId/subgraphs\", async (context) => {\n const rows = await db.select().from(assistants).where(and(eq(assistants.assistant_id, context.req.param(\"assistantId\")),\n inArray(assistants.user_id, [context.get(\"user\").identity, \"system\"]), ...authorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n const record = assistant(rows[0]);\n const graph = await getGraph(record.graph_id, { user: context.get(\"user\"), accessContext: \"assistants.read\" });\n if (!graph.getSubgraphsAsync) return context.json({});\n const result: Record<string, unknown> = {};\n const recurse = context.req.query(\"recurse\") === \"true\";\n for await (const [namespace, subgraph] of graph.getSubgraphsAsync(context.req.query(\"namespace\"), recurse)) {\n result[namespace] = graphSchemas(subgraph);\n }\n return context.json(result);\n});\n",
17
+ "import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { PostgresSaver } from \"@langchain/langgraph-checkpoint-postgres\";\nimport { eq } from \"drizzle-orm\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { db } from \"../core/database.ts\";\nimport { assistants, assistantVersions } from \"../core/schema.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport type { GraphDefinition, GraphFactory, RunnableGraph, ServerRuntime } from \"../graph.ts\";\nimport { loadModuleExport } from \"../module-loader.ts\";\nimport { AegraStore } from \"../routes/store.ts\";\nimport type { AuthUser, JsonObject } from \"../types.ts\";\n\nexport type { GraphFactory, RunnableGraph, ServerRuntime } from \"../graph.ts\";\n\n/**\n * Call a graph factory with the arguments it declares.\n *\n * JavaScript cannot inspect parameter types, so a one-parameter factory is\n * disambiguated by name: `runtime`/`rt` receives the ServerRuntime (the\n * FastAPI examples' `def graph(runtime)`), anything else receives the\n * RunnableConfig. Zero-argument factories are resolved once, at startup.\n */\nfunction firstParameterName(factory: (...args: never[]) => unknown): string {\n const source = factory.toString();\n const arrow = source.match(/^\\s*(?:async\\s*)?\\(?\\s*([A-Za-z_$][\\w$]*)/);\n return arrow?.[1] ?? \"\";\n}\n\nexport function callGraphFactory(\n factory: GraphFactory,\n config: RunnableConfig | undefined,\n runtime: ServerRuntime,\n): RunnableGraph | Promise<RunnableGraph> {\n const callable = factory as (\n config?: RunnableConfig,\n runtime?: ServerRuntime,\n ) => RunnableGraph | Promise<RunnableGraph>;\n if (factory.length === 0) return callable();\n if (factory.length === 1) {\n // A runtime factory takes the runtime as its only argument, not as the second.\n return /^(runtime|rt)$/i.test(firstParameterName(factory as (...args: never[]) => unknown))\n ? callable(runtime as unknown as RunnableConfig)\n : callable(config);\n }\n return callable(config, runtime);\n}\n\nconst graphs = new Map<string, GraphDefinition>();\nlet checkpointer: PostgresSaver | undefined;\n\nexport function deterministicAssistantId(graphId: string): string {\n const namespace = Buffer.from(\"6ba7b8219dad11d180b400c04fd430c8\", \"hex\");\n const name = new TextEncoder().encode(graphId);\n const hash = new Bun.CryptoHasher(\"sha1\").update(Buffer.concat([namespace, name])).digest();\n hash[6] = (hash[6]! & 0x0f) | 0x50;\n hash[8] = (hash[8]! & 0x3f) | 0x80;\n const hex = Buffer.from(hash.subarray(0, 16)).toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function assistantIdForGraph(graphId: string): string {\n return graphs.has(graphId) ? deterministicAssistantId(graphId) : graphId;\n}\n\nexport function isRunnableGraph(value: unknown): value is RunnableGraph {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as { invoke?: unknown; stream?: unknown };\n return typeof candidate.invoke === \"function\" && typeof candidate.stream === \"function\";\n}\n\nfunction assertGraphDefinition(value: unknown, exportName: string, modulePath: string): asserts value is GraphDefinition {\n if (typeof value !== \"function\" && !isRunnableGraph(value)) {\n throw new Error(`Graph export '${exportName}' in ${modulePath} must be a runnable graph or graph factory`);\n }\n}\n\nexport async function initializeGraphs(): Promise<void> {\n const config = await loadConfig();\n checkpointer ??= PostgresSaver.fromConnString(settings.DATABASE_URL);\n await checkpointer.setup();\n for (const [graphId, importPath] of Object.entries(config.graphs)) {\n const { exported, modulePath, exportName } = await loadModuleExport(importPath, {\n defaultExport: \"graph\",\n kind: \"Graph\",\n pythonMessage: `Graph '${graphId}' points at a Python module; port it to TypeScript and update aegra.json`,\n });\n assertGraphDefinition(exported, exportName, modulePath);\n graphs.set(graphId, exported);\n }\n await db.transaction(async (transaction) => {\n for (const graphId of graphs.keys()) {\n const assistantId = assistantIdForGraph(graphId);\n const inserted = await transaction.insert(assistants).values({\n assistant_id: assistantId, name: graphId, description: `Default assistant for graph '${graphId}'`, graph_id: graphId,\n config: {}, context: {}, user_id: \"system\", metadata: { created_by: \"system\" },\n }).onConflictDoNothing().returning({ assistant_id: assistants.assistant_id });\n if (inserted[0]) await transaction.insert(assistantVersions).values({\n assistant_id: assistantId, version: 1, name: graphId, description: `Default assistant for graph '${graphId}'`,\n graph_id: graphId, config: {}, context: {}, metadata: { created_by: \"system\" },\n });\n }\n });\n}\n\nexport async function getGraph(\n graphId: string,\n options: {\n config?: RunnableConfig;\n user: AuthUser;\n context?: JsonObject | null;\n accessContext: ServerRuntime[\"accessContext\"];\n },\n): Promise<RunnableGraph> {\n const configured = graphs.get(graphId);\n if (!configured) throw new ApiError(404, `Graph '${graphId}' was not found`);\n const store = new AegraStore(options.user);\n const runtime: ServerRuntime = {\n accessContext: options.accessContext,\n user: options.user,\n store,\n ...(options.context !== undefined ? { context: options.context } : {}),\n };\n const resolved = typeof configured === \"function\" ? await callGraphFactory(configured, options.config, runtime) : configured;\n if (!isRunnableGraph(resolved)) throw new Error(`Graph factory '${graphId}' did not return a runnable graph`);\n if (!resolved.checkpointer && checkpointer) resolved.checkpointer = checkpointer;\n return resolved;\n}\n\nexport function configuredGraphIds(): string[] {\n return [...graphs.keys()];\n}\n\nexport async function closeGraphs(): Promise<void> {\n if (checkpointer) await checkpointer.end();\n checkpointer = undefined;\n graphs.clear();\n}\n\nexport async function deleteThreadCheckpoints(threadId: string): Promise<void> {\n await checkpointer?.deleteThread(threadId);\n}\n",
18
+ "import { Hono } from \"hono\";\nimport { BedrockEmbeddings } from \"@langchain/aws\";\nimport { CohereEmbeddings } from \"@langchain/cohere\";\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { BaseStore, type Item, type Operation, type OperationResults, type SearchItem } from \"@langchain/langgraph-checkpoint\";\nimport { and, desc, eq, sql } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { client, db } from \"../core/database.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { storeItems } from \"../core/schema.ts\";\nimport { asJsonObject, clampLimit, getAuthorizationValue, jsonObjectSchema, parseJson, parseOffset, parseValue } from \"../core/validation.ts\";\nimport type { AppVariables, AuthUser, JsonObject, JsonValue } from \"../types.ts\";\n\nconst putSchema = z.object({ namespace: z.array(z.string()).min(1), key: z.string().min(1), value: jsonObjectSchema });\nconst keySchema = z.object({ namespace: z.array(z.string()).min(1), key: z.string().min(1) });\nconst searchSchema = z.object({\n namespace_prefix: z.array(z.string()).default([]), filter: jsonObjectSchema.nullable().optional(),\n query: z.string().nullable().optional(), limit: z.number().int().positive().nullable().default(20),\n offset: z.number().int().nonnegative().nullable().default(0),\n});\nconst namespacesSchema = z.object({\n prefix: z.array(z.string()).nullable().optional(), suffix: z.array(z.string()).nullable().optional(),\n max_depth: z.number().int().positive().max(100).nullable().optional(), limit: z.number().int().positive().max(1000).default(100),\n offset: z.number().int().nonnegative().default(0),\n});\n\nfunction namespaceQuery(values: string[]): string[] {\n if (values.length === 1 && values[0]?.trim().startsWith(\"[\")) {\n let parsed: unknown;\n try { parsed = JSON.parse(values[0]); } catch { throw new ApiError(400, \"namespace must be an array or dot-separated string\"); }\n if (!Array.isArray(parsed) || parsed.some((part) => typeof part !== \"string\")) throw new ApiError(400, \"namespace must contain strings\");\n return parsed;\n }\n return values.flatMap((value) => value.split(\".\").filter(Boolean));\n}\n\ntype Embedder = { embedDocuments(texts: string[]): Promise<number[][]>; embedQuery(text: string): Promise<number[]> };\ntype SemanticStore = { dims: number; fields: string[]; embedder: Embedder };\nlet semanticStorePromise: Promise<SemanticStore | null> | undefined;\n\nasync function semanticStore(): Promise<SemanticStore | null> {\n semanticStorePromise ??= (async () => {\n const index = (await loadConfig()).store?.index;\n if (!index) return null;\n const separator = index.embed.indexOf(\":\");\n if (separator < 1 || separator === index.embed.length - 1) throw new Error(\"store.index.embed must use provider:model format\");\n const provider = index.embed.slice(0, separator);\n const model = index.embed.slice(separator + 1);\n let embedder: Embedder;\n if (provider === \"openai\") embedder = new OpenAIEmbeddings({ model, dimensions: index.dims });\n else if (provider === \"bedrock\") embedder = new BedrockEmbeddings({ model, dimensions: index.dims });\n else if (provider === \"cohere\") embedder = new CohereEmbeddings({ model });\n else throw new Error(`Unsupported embedding provider '${provider}'`);\n return { dims: index.dims, fields: index.fields ?? [\"$\"], embedder };\n })();\n return semanticStorePromise;\n}\n\nfunction valueAtPath(value: JsonObject, path: string): JsonValue | undefined {\n let current: JsonValue | undefined = value;\n for (const segment of path.split(\".\")) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined;\n current = current[segment];\n }\n return current;\n}\n\nexport function embeddingText(value: JsonObject, fields: string[]): string | null {\n const parts = fields.flatMap((field) => {\n const selected = field === \"$\" ? value : valueAtPath(value, field);\n return selected === undefined ? [] : [typeof selected === \"string\" ? selected : JSON.stringify(selected)];\n });\n return parts.length ? parts.join(\"\\n\") : null;\n}\n\nfunction vectorLiteral(vector: number[], dims: number): string {\n if (vector.length !== dims || vector.some((value) => !Number.isFinite(value))) {\n throw new Error(`Embedding model returned ${vector.length} dimensions; expected ${dims}`);\n }\n return `[${vector.join(\",\")}]`;\n}\n\nconst USER_SCOPE_PREFIX = \"users\";\n\n/**\n * Bury a namespace under its scope head unless it already starts with it.\n *\n * Mirrors the FastAPI `apply_namespace_scoping`: user scope is the default\n * (`[\"users\", identity, ...]`), a configured prefix opts into a shared scope\n * keyed by user attributes, and the head is applied exactly once so a client\n * echoing back a scoped namespace round-trips. Isolation lives in the\n * namespace, which is why two users sharing an attribute value share data.\n */\nexport function scopeNamespace(namespace: string[], user: AuthUser, scopes: Record<string, string[]>): string[] {\n const prefix = namespace[0];\n const attributes = prefix && prefix !== USER_SCOPE_PREFIX ? scopes[prefix] : undefined;\n const head = attributes?.length\n ? [prefix!, ...attributes.map((attribute) => {\n const value = user[attribute];\n if (value === null || value === undefined || typeof value === \"object\" || String(value) === \"\") {\n throw new ApiError(403, `User has no '${attribute}' required for '${prefix}'-scoped store access`);\n }\n return String(value);\n })]\n : [USER_SCOPE_PREFIX, user.identity];\n return head.every((segment, index) => namespace[index] === segment) ? namespace : [...head, ...namespace];\n}\n\nasync function scopedNamespace(user: AuthUser, namespace: string[]): Promise<string[]> {\n return scopeNamespace(namespace, user, (await loadConfig()).store?.scopes ?? {});\n}\n\nfunction graphItem(row: Record<string, unknown>): Item {\n return { namespace: Array.isArray(row.namespace) ? row.namespace.map(String) : [], key: String(row.key),\n value: asJsonObject(row.value), createdAt: new Date(String(row.created_at)), updatedAt: new Date(String(row.updated_at)) };\n}\n\nexport class AegraStore extends BaseStore {\n constructor(private readonly user: AuthUser) { super(); }\n\n override async get(namespace: string[], key: string): Promise<Item | null> {\n const scoped = await scopedNamespace(this.user, namespace);\n const rows = await db.select().from(storeItems)\n .where(and(eq(storeItems.namespace, scoped), eq(storeItems.key, key))).limit(1);\n return rows[0] ? graphItem(rows[0]) : null;\n }\n\n override async put(namespace: string[], key: string, value: Record<string, unknown>, index?: false | string[]): Promise<void> {\n const scoped = await scopedNamespace(this.user, namespace);\n const semantic = await semanticStore();\n const fields = index === false ? [] : index ?? semantic?.fields ?? [];\n const text = semantic && fields.length ? embeddingText(asJsonObject(value), fields) : null;\n const embedding = semantic && text ? vectorLiteral((await semantic.embedder.embedDocuments([text]))[0] ?? [], semantic.dims) : null;\n await db.transaction(async (transaction) => {\n await transaction.insert(storeItems).values({ user_id: this.user.identity, namespace: scoped, key, value: asJsonObject(value) })\n .onConflictDoUpdate({\n target: [storeItems.namespace, storeItems.key],\n set: { value: asJsonObject(value), user_id: this.user.identity, updated_at: new Date() },\n });\n if (embedding) await transaction.execute(sql`INSERT INTO store_embeddings (user_id, namespace, key, embedding)\n VALUES (${this.user.identity}, ${sql.param(scoped, storeItems.namespace)}, ${key}, ${embedding}::vector)\n ON CONFLICT (namespace, key) DO UPDATE SET embedding = excluded.embedding`);\n else if (semantic) await transaction.execute(sql`DELETE FROM store_embeddings\n WHERE namespace = ${sql.param(scoped, storeItems.namespace)} AND key = ${key}`);\n });\n }\n\n override async delete(namespace: string[], key: string): Promise<void> {\n const scoped = await scopedNamespace(this.user, namespace);\n await db.delete(storeItems).where(and(eq(storeItems.namespace, scoped), eq(storeItems.key, key)));\n }\n\n override async search(namespacePrefix: string[], options: {\n filter?: Record<string, unknown>; limit?: number; offset?: number; query?: string;\n } = {}): Promise<SearchItem[]> {\n const limit = clampLimit(options.limit, 10, settings.MAX_SEARCH_LIMIT);\n const offset = parseOffset(options.offset);\n const scoped = await scopedNamespace(this.user, namespacePrefix);\n const semantic = options.query ? await semanticStore() : null;\n if (options.query && semantic) {\n const embedding = vectorLiteral(await semantic.embedder.embedQuery(options.query), semantic.dims);\n const rows = await client<Record<string, unknown>[]>`SELECT s.*, 1 - (e.embedding <=> ${embedding}::vector) AS score\n FROM store_items s JOIN store_embeddings e USING (namespace, key)\n WHERE s.namespace[1:cardinality(${client.array(scoped)}::text[])] = ${client.array(scoped)}\n ${options.filter ? client`AND s.value @> ${client.json(options.filter as JsonObject)}` : client``}\n ORDER BY e.embedding <=> ${embedding}::vector LIMIT ${limit} OFFSET ${offset}`;\n return rows.map((row) => ({ ...graphItem(row), score: Number(row.score) }));\n }\n const rows = await db.select().from(storeItems).where(and(\n sql`${storeItems.namespace}[1:cardinality(${sql.param(scoped, storeItems.namespace)}::text[])] = ${sql.param(scoped, storeItems.namespace)}`,\n options.filter ? sql`${storeItems.value} @> ${JSON.stringify(options.filter)}::jsonb` : undefined,\n options.query ? sql`${storeItems.value}::text ILIKE ${`%${options.query}%`}` : undefined))\n .orderBy(desc(storeItems.updated_at)).limit(limit).offset(offset);\n return rows.map((row) => graphItem(row));\n }\n\n override async listNamespaces(options: {\n prefix?: string[]; suffix?: string[]; maxDepth?: number; limit?: number; offset?: number;\n } = {}): Promise<string[][]> {\n const scoped = await scopedNamespace(this.user, options.prefix ?? []);\n const rows = await db.selectDistinct({ namespace: storeItems.namespace }).from(storeItems)\n .where(sql`${storeItems.namespace}[1:cardinality(${sql.param(scoped, storeItems.namespace)}::text[])] = ${sql.param(scoped, storeItems.namespace)}`)\n .orderBy(storeItems.namespace).limit(clampLimit(options.limit, 100, 1000)).offset(parseOffset(options.offset));\n let namespaces = rows.map((row) => row.namespace as string[]);\n if (options.suffix) namespaces = namespaces.filter((ns) => ns.slice(-options.suffix!.length).join(\"\\0\") === options.suffix!.join(\"\\0\"));\n if (options.maxDepth) namespaces = namespaces.map((ns) => ns.slice(0, options.maxDepth));\n return [...new Map(namespaces.map((namespace) => [JSON.stringify(namespace), namespace])).values()];\n }\n\n async batch<Op extends Operation[]>(operations: Op): Promise<OperationResults<Op>> {\n const results: unknown[] = [];\n for (const operation of operations) {\n if (\"namespacePrefix\" in operation) results.push(await this.search(operation.namespacePrefix, operation));\n else if (\"namespace\" in operation) {\n if (\"value\" in operation) {\n if (operation.value === null) await this.delete(operation.namespace, operation.key);\n else await this.put(operation.namespace, operation.key, operation.value, operation.index);\n results.push(undefined);\n } else results.push(await this.get(operation.namespace, operation.key));\n } else {\n const prefix = operation.matchConditions?.find((condition) => condition.matchType === \"prefix\")?.path;\n const suffix = operation.matchConditions?.find((condition) => condition.matchType === \"suffix\")?.path;\n results.push(await this.listNamespaces({\n ...(prefix ? { prefix: prefix.filter((value): value is string => value !== \"*\") } : {}),\n ...(suffix ? { suffix: suffix.filter((value): value is string => value !== \"*\") } : {}),\n ...(operation.maxDepth ? { maxDepth: operation.maxDepth } : {}), limit: operation.limit, offset: operation.offset,\n }));\n }\n }\n return results as OperationResults<Op>;\n }\n}\n\nexport const storeRoutes = new Hono<{ Variables: AppVariables }>();\n\nstoreRoutes.put(\"/store/items\", async (context) => {\n const body = await parseJson(context, putSchema);\n await new AegraStore(context.get(\"user\")).put(body.namespace, body.key, body.value);\n return context.body(null, 204);\n});\n\nstoreRoutes.get(\"/store/items\", async (context) => {\n const authorization = getAuthorizationValue(context);\n const body = parseValue({\n namespace: Array.isArray(authorization.namespace) ? authorization.namespace : namespaceQuery(context.req.queries(\"namespace\") ?? []),\n key: typeof authorization.key === \"string\" ? authorization.key : context.req.query(\"key\"),\n }, keySchema);\n const found = await new AegraStore(context.get(\"user\")).get(body.namespace, body.key);\n if (!found) throw new ApiError(404, \"Store item not found\");\n return context.json({ namespace: found.namespace, key: found.key, value: found.value });\n});\n\nstoreRoutes.delete(\"/store/items\", async (context) => {\n const body = context.req.header(\"content-type\")?.includes(\"application/json\")\n ? await parseJson(context, keySchema)\n : parseValue({\n namespace: Array.isArray(getAuthorizationValue(context).namespace)\n ? getAuthorizationValue(context).namespace : namespaceQuery(context.req.queries(\"namespace\") ?? []),\n key: typeof getAuthorizationValue(context).key === \"string\"\n ? getAuthorizationValue(context).key : context.req.query(\"key\"),\n }, keySchema);\n await new AegraStore(context.get(\"user\")).delete(body.namespace, body.key);\n return context.body(null, 204);\n});\n\nstoreRoutes.post(\"/store/items/search\", async (context) => {\n const body = await parseJson(context, searchSchema);\n const authorization = getAuthorizationValue(context);\n const directFilter = Object.fromEntries(Object.entries(authorization).filter(([key]) =>\n ![\"namespace_prefix\", \"query\", \"limit\", \"offset\", \"filter\"].includes(key)));\n const filter = { ...asJsonObject(body.filter), ...directFilter };\n const limit = clampLimit(body.limit, 20, settings.MAX_SEARCH_LIMIT);\n const offset = parseOffset(body.offset);\n const found = await new AegraStore(context.get(\"user\")).search(body.namespace_prefix, {\n ...(Object.keys(filter).length ? { filter } : {}), ...(body.query ? { query: body.query } : {}), limit, offset,\n });\n const items = found.map((entry) => ({ namespace: entry.namespace, key: entry.key, value: asJsonObject(entry.value),\n created_at: entry.createdAt.toISOString(), updated_at: entry.updatedAt.toISOString(), ...(entry.score === undefined ? {} : { score: entry.score }) }));\n return context.json({ items, total: items.length, limit, offset });\n});\n\nstoreRoutes.post(\"/store/namespaces\", async (context) => {\n const body = await parseJson(context, namespacesSchema);\n const namespaces = await new AegraStore(context.get(\"user\")).listNamespaces({ ...(body.prefix ? { prefix: body.prefix } : {}),\n ...(body.suffix ? { suffix: body.suffix } : {}), ...(body.max_depth ? { maxDepth: body.max_depth } : {}),\n limit: body.limit, offset: body.offset });\n return context.json({ namespaces });\n});\n",
19
+ "import { Cron } from \"croner\";\nimport { and, asc, desc, eq, inArray, sql, type SQL } from \"drizzle-orm\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { settings } from \"../config/settings.ts\";\nimport { db } from \"../core/database.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { assistants, crons, threads } from \"../core/schema.ts\";\nimport { asJsonObject, getAuthorizationValue, jsonObjectSchema, parseJson } from \"../core/validation.ts\";\nimport { cronRunCreate } from \"../services/cron-scheduler.ts\";\nimport { assistantIdForGraph } from \"../services/graph-registry.ts\";\nimport { authorizeResource } from \"../middleware/auth.ts\";\nimport { createAndDispatchRun } from \"./runs.ts\";\nimport type { AppVariables } from \"../types.ts\";\n\nconst createSchema = z.object({\n assistant_id: z.string().min(1), schedule: z.string().min(1).max(256), input: jsonObjectSchema,\n metadata: jsonObjectSchema.nullable().default({}), config: jsonObjectSchema.nullable().default({}),\n context: jsonObjectSchema.nullable().default({}), on_run_completed: z.enum([\"delete\", \"keep\"]).nullable().optional(),\n end_time: z.string().datetime().nullable().optional(), enabled: z.boolean().nullable().default(true),\n timezone: z.string().max(64).nullable().optional(), stream_mode: z.union([z.string().max(64), z.array(z.string())]).nullable().optional(),\n webhook: z.string().url().refine((value) => [\"http:\", \"https:\"].includes(new URL(value).protocol), \"webhook must use http or https\").nullable().optional(),\n multitask_strategy: z.enum([\"reject\", \"interrupt\", \"rollback\", \"enqueue\"]).nullable().optional(),\n interrupt_before: z.union([z.literal(\"*\"), z.array(z.string())]).nullable().optional(),\n interrupt_after: z.union([z.literal(\"*\"), z.array(z.string())]).nullable().optional(),\n stream_subgraphs: z.boolean().nullable().optional(),\n});\nconst updateSchema = createSchema.omit({ assistant_id: true }).partial();\nconst searchSchema = z.object({\n assistant_id: z.string().nullable().optional(), thread_id: z.string().nullable().optional(), enabled: z.boolean().nullable().optional(),\n limit: z.number().int().positive().max(1000).default(10), offset: z.number().int().nonnegative().default(0),\n sort_by: z.enum([\"created_at\", \"updated_at\", \"next_run_date\"]).nullable().optional(),\n sort_order: z.enum([\"asc\", \"desc\"]).nullable().optional(),\n});\n\nexport function validateSchedule(schedule: string, timezone?: string | null, after?: Date): Date | null {\n if (!settings.CRON_ALLOW_SECONDS_SCHEDULE && schedule.trim().split(/\\s+/).length === 6) {\n throw new ApiError(422, \"6-field cron schedules are disabled\");\n }\n try { return new Cron(schedule, timezone ? { timezone } : {}).nextRun(after); }\n catch { throw new ApiError(422, \"Invalid cron schedule\"); }\n}\n\nfunction validateCronBody(body: z.infer<typeof updateSchema>): void {\n if (new TextEncoder().encode(JSON.stringify(body)).byteLength > settings.CRON_MAX_PAYLOAD_BYTES) {\n throw new ApiError(422, `Cron payload exceeds ${settings.CRON_MAX_PAYLOAD_BYTES} bytes`);\n }\n if (body.end_time && new Date(body.end_time) <= new Date()) throw new ApiError(422, \"end_time must be in the future\");\n}\n\nfunction cronPayload(body: z.infer<typeof updateSchema>): Record<string, unknown> {\n const { input, config, context, timezone, webhook, stream_mode, multitask_strategy, interrupt_before, interrupt_after, stream_subgraphs } = body;\n return Object.fromEntries(Object.entries({\n input, config, context, timezone, webhook, stream_mode, multitask_strategy, interrupt_before, interrupt_after, stream_subgraphs,\n }).filter(([, value]) => value !== undefined));\n}\n\nfunction cron(row: Record<string, unknown>): Record<string, unknown> {\n const payload = asJsonObject(row.payload);\n if (typeof payload.webhook === \"string\") {\n try {\n const webhook = new URL(payload.webhook);\n webhook.username = \"\";\n webhook.password = \"\";\n payload.webhook = webhook.toString();\n } catch { /* retain legacy malformed values */ }\n }\n return {\n cron_id: String(row.cron_id), assistant_id: String(row.assistant_id), thread_id: row.thread_id,\n on_run_completed: row.on_run_completed, end_time: row.end_time, schedule: String(row.schedule),\n created_at: new Date(String(row.created_at)).toISOString(), updated_at: new Date(String(row.updated_at)).toISOString(),\n payload, user_id: String(row.user_id), next_run_date: row.next_run_date,\n metadata: asJsonObject(row.metadata), enabled: Boolean(row.enabled),\n };\n}\n\nfunction authorizationFilters(context: Parameters<typeof parseJson>[0]): SQL[] {\n const value = getAuthorizationValue(context);\n const metadata = asJsonObject(value.metadata);\n return [\n typeof value.cron_id === \"string\" ? eq(crons.cron_id, value.cron_id) : undefined,\n typeof value.assistant_id === \"string\" ? eq(crons.assistant_id, value.assistant_id) : undefined,\n typeof value.thread_id === \"string\" ? eq(crons.thread_id, value.thread_id) : undefined,\n Object.keys(metadata).length ? sql`${crons.metadata} @> ${JSON.stringify(metadata)}::jsonb` : undefined,\n ].filter((filter): filter is SQL => filter !== undefined);\n}\n\nasync function createCron(threadId: string | null, context: Parameters<typeof parseJson>[0]): Promise<Response> {\n const body = await parseJson(context, createSchema);\n validateCronBody(body);\n const userId = context.get(\"user\").identity;\n const assistantId = assistantIdForGraph(body.assistant_id);\n const assistantAuthorization = await authorizeResource(context, \"assistants\", \"read\", { assistant_id: body.assistant_id });\n const assistantMetadata = asJsonObject(assistantAuthorization.metadata);\n const assistant = await db.select({ assistant_id: assistants.assistant_id }).from(assistants)\n .where(and(eq(assistants.assistant_id, assistantId), inArray(assistants.user_id, [userId, \"system\"]),\n Object.keys(assistantMetadata).length ? sql`${assistants.metadata} @> ${JSON.stringify(assistantMetadata)}::jsonb` : undefined)).limit(1);\n if (!assistant[0]) throw new ApiError(404, \"Assistant not found\");\n if (settings.CRON_MAX_PER_USER > 0) {\n const count = await db.select({ count: sql<number>`count(*)::int` }).from(crons).where(eq(crons.user_id, userId));\n if (Number(count[0]?.count ?? 0) >= settings.CRON_MAX_PER_USER) throw new ApiError(429, \"Cron limit reached\");\n }\n if (threadId) {\n const threadAuthorization = await authorizeResource(context, \"threads\", \"read\", { thread_id: threadId });\n const threadMetadata = asJsonObject(threadAuthorization.metadata);\n const thread = await db.select({ thread_id: threads.thread_id }).from(threads)\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, userId),\n Object.keys(threadMetadata).length ? sql`${threads.metadata_json} @> ${JSON.stringify(threadMetadata)}::jsonb` : undefined)).limit(1);\n if (!thread[0]) throw new ApiError(404, \"Thread not found\");\n }\n const first = validateSchedule(body.schedule, body.timezone);\n const next = body.enabled === false || !first ? first : validateSchedule(body.schedule, body.timezone, first);\n const payload = cronPayload(body);\n const rows = await db.insert(crons).values({ assistant_id: assistantId, thread_id: threadId, user_id: userId,\n schedule: body.schedule, payload: asJsonObject(payload), metadata: body.metadata ?? {},\n on_run_completed: body.on_run_completed ?? null, enabled: body.enabled ?? true,\n end_time: body.end_time ? new Date(body.end_time) : null, next_run_date: next }).returning();\n const created = cron(rows[0] as Record<string, unknown>);\n if (body.enabled === false) return context.json(created);\n try {\n return context.json(await createAndDispatchRun(context, threadId ?? crypto.randomUUID(), cronRunCreate(rows[0] as Record<string, unknown>, threadId === null), threadId === null));\n } catch (error) {\n await db.delete(crons).where(and(eq(crons.cron_id, String(rows[0]?.cron_id)), eq(crons.user_id, userId)));\n throw error;\n }\n}\n\nexport const cronRoutes = new Hono<{ Variables: AppVariables }>();\ncronRoutes.post(\"/runs/crons\", (context) => createCron(null, context));\ncronRoutes.post(\"/threads/:threadId/runs/crons\", (context) => createCron(context.req.param(\"threadId\"), context));\n\ncronRoutes.patch(\"/runs/crons/:cronId\", async (context) => {\n const body = await parseJson(context, updateSchema);\n validateCronBody(body);\n const current = await db.select().from(crons).where(and(eq(crons.cron_id, context.req.param(\"cronId\")),\n eq(crons.user_id, context.get(\"user\").identity), ...authorizationFilters(context))).limit(1);\n if (!current[0]) throw new ApiError(404, \"Cron not found\");\n const schedule = body.schedule ?? String(current[0].schedule);\n const payload = { ...asJsonObject(current[0].payload), ...cronPayload(body) };\n if (body.schedule) validateSchedule(body.schedule, typeof payload.timezone === \"string\" ? payload.timezone : undefined);\n const needsNext = body.schedule !== undefined || body.timezone !== undefined\n || (body.enabled === true && current[0].next_run_date && new Date(current[0].next_run_date) <= new Date());\n const next = needsNext\n ? validateSchedule(schedule, typeof payload.timezone === \"string\" ? payload.timezone : undefined)\n : current[0].next_run_date;\n const rows = await db.update(crons).set({ schedule, payload: asJsonObject(payload),\n metadata: body.metadata ?? asJsonObject(current[0].metadata), enabled: body.enabled ?? Boolean(current[0].enabled),\n end_time: body.end_time ? new Date(body.end_time) : current[0].end_time, on_run_completed: body.on_run_completed ?? current[0].on_run_completed,\n next_run_date: next, updated_at: new Date() }).where(and(eq(crons.cron_id, context.req.param(\"cronId\")),\n eq(crons.user_id, context.get(\"user\").identity))).returning();\n return context.json(cron(rows[0] as Record<string, unknown>));\n});\n\ncronRoutes.delete(\"/runs/crons/:cronId\", async (context) => {\n const rows = await db.delete(crons).where(and(eq(crons.cron_id, context.req.param(\"cronId\")),\n eq(crons.user_id, context.get(\"user\").identity), ...authorizationFilters(context))).returning({ cron_id: crons.cron_id });\n if (!rows[0]) throw new ApiError(404, \"Cron not found\");\n return context.body(null, 204);\n});\n\ncronRoutes.post(\"/runs/crons/search\", async (context) => {\n const body = await parseJson(context, searchSchema);\n const orderField = crons[body.sort_by ?? \"created_at\"];\n const rows = await db.select().from(crons).where(and(eq(crons.user_id, context.get(\"user\").identity),\n body.assistant_id ? eq(crons.assistant_id, assistantIdForGraph(body.assistant_id)) : undefined,\n body.thread_id ? eq(crons.thread_id, body.thread_id) : undefined,\n body.enabled === null || body.enabled === undefined ? undefined : eq(crons.enabled, body.enabled),\n ...authorizationFilters(context)))\n .orderBy(body.sort_order === \"desc\" ? desc(orderField) : asc(orderField)).limit(body.limit).offset(body.offset);\n return context.json(rows.map((row) => cron(row)));\n});\n\ncronRoutes.post(\"/runs/crons/count\", async (context) => {\n const body = await parseJson(context, searchSchema.partial());\n const rows = await db.select({ count: sql<number>`count(*)::int` }).from(crons).where(and(\n eq(crons.user_id, context.get(\"user\").identity),\n body.assistant_id ? eq(crons.assistant_id, assistantIdForGraph(body.assistant_id)) : undefined,\n body.thread_id ? eq(crons.thread_id, body.thread_id) : undefined,\n ...authorizationFilters(context)));\n return context.json(Number(rows[0]?.count ?? 0));\n});\n",
20
+ "import { Cron } from \"croner\";\nimport { and, asc, eq, inArray, isNull, lt, lte, or } from \"drizzle-orm\";\nimport { settings } from \"../config/settings.ts\";\nimport { db } from \"../core/database.ts\";\nimport { crons, runs, threads } from \"../core/schema.ts\";\nimport { asJsonObject, initialThreadMetadata } from \"../core/validation.ts\";\nimport { dispatchRun, runCreateSchema, runFromRow, type RunCreate } from \"../routes/runs.ts\";\n\nlet timer: Timer | undefined;\n\nexport function cronRunCreate(row: Record<string, unknown>, stateless: boolean): RunCreate {\n const parsed = runCreateSchema.parse({\n ...asJsonObject(row.payload),\n assistant_id: String(row.assistant_id),\n on_completion: row.on_run_completed ?? undefined,\n });\n return stateless ? { ...parsed, ephemeral: \"executor\" } : parsed;\n}\n\nexport async function tickCrons(): Promise<void> {\n const lease = new Date(Date.now() + settings.CRON_CLAIM_DURATION_SECONDS * 1000);\n const due = await db.transaction(async (transaction) => {\n const now = new Date();\n const rows = await transaction.select().from(crons).where(and(eq(crons.enabled, true), lte(crons.next_run_date, now),\n or(isNull(crons.claimed_until), lt(crons.claimed_until, now)))).orderBy(asc(crons.next_run_date)).limit(settings.CRON_TICK_BATCH_SIZE)\n .for(\"update\", { skipLocked: true });\n if (rows.length) await transaction.update(crons).set({ claimed_until: lease })\n .where(inArray(crons.cron_id, rows.map((row) => row.cron_id)));\n return rows;\n });\n for (const row of due) {\n let ephemeralThreadId: string | undefined;\n let runCreated = false;\n try {\n const userId = String(row.user_id);\n if (row.end_time && new Date(row.end_time) <= new Date()) {\n await db.update(crons).set({ enabled: false, claimed_until: null, updated_at: new Date() })\n .where(eq(crons.cron_id, String(row.cron_id)));\n continue;\n }\n const threadId = row.thread_id ? String(row.thread_id) : crypto.randomUUID();\n if (!row.thread_id) {\n await db.insert(threads).values({ thread_id: threadId, metadata_json: initialThreadMetadata(userId), user_id: userId });\n ephemeralThreadId = threadId;\n }\n const rawPayload = asJsonObject(row.payload);\n const payload = cronRunCreate(row, !row.thread_id);\n const createdRuns = await db.insert(runs).values({ thread_id: threadId, assistant_id: String(row.assistant_id),\n input: payload.input ?? null, config: payload.config ?? {}, context: payload.context ?? {}, user_id: userId,\n execution_params: asJsonObject(payload) }).returning();\n runCreated = true;\n await dispatchRun(runFromRow(createdRuns[0] as Record<string, unknown>), payload,\n { identity: userId, isAuthenticated: true, permissions: [] });\n const timezone = typeof rawPayload.timezone === \"string\" ? rawPayload.timezone : undefined;\n const next = new Cron(String(row.schedule), timezone ? { timezone } : {}).nextRun();\n const expired = row.end_time && next && next > new Date(String(row.end_time));\n await db.update(crons).set({ next_run_date: next, enabled: expired ? false : Boolean(row.enabled),\n claimed_until: null, updated_at: new Date() }).where(eq(crons.cron_id, String(row.cron_id)));\n } catch (error) {\n console.error(\"cron firing failed\", row.cron_id, error);\n if (ephemeralThreadId && !runCreated) await db.delete(threads).where(eq(threads.thread_id, ephemeralThreadId));\n await db.update(crons).set({ claimed_until: null }).where(eq(crons.cron_id, String(row.cron_id)));\n }\n }\n}\n\nexport function startCronScheduler(): void {\n if (!settings.CRON_ENABLED || timer) return;\n const tick = (): void => void tickCrons().catch((error: unknown) => console.error(\"cron scheduler failed\", error));\n tick();\n timer = setInterval(tick, settings.CRON_POLL_INTERVAL_SECONDS * 1000);\n}\n\nexport function stopCronScheduler(): void {\n if (timer) clearInterval(timer);\n timer = undefined;\n}\n",
21
+ "import { Command, STREAM_EVENTS_V3_MODES, createGraphRunStream } from \"@langchain/langgraph\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { and, desc, eq, inArray, isNull, lt, notExists, or, sql, type SQL } from \"drizzle-orm\";\nimport type { Context } from \"hono\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { settings } from \"../config/settings.ts\";\nimport { db } from \"../core/database.ts\";\nimport { createRedisConnection, getRedis } from \"../core/redis.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { assistants, runs as runsTable, threads } from \"../core/schema.ts\";\nimport { asJsonObject, asJsonValue, clampLimit, getAuthorizationValue, initialThreadMetadata, jsonObjectSchema, parseJson, parseOffset } from \"../core/validation.ts\";\nimport { publish, allocateRunEventId } from \"../services/broker.ts\";\nimport { authorizeResource } from \"../middleware/auth.ts\";\nimport { withRunTrace } from \"../observability.ts\";\nimport { assistantIdForGraph, deleteThreadCheckpoints, getGraph } from \"../services/graph-registry.ts\";\nimport { payloadHasInterrupt, streamRunEvents, DEFAULT_STREAM_MODES } from \"../services/run-stream.ts\";\nimport { publishProtocolEvent } from \"../services/protocol-stream.ts\";\nimport { sseResponse } from \"../services/streaming.ts\";\nimport { AegraStore } from \"./store.ts\";\nimport type { AppVariables, AuthUser, JsonObject, RunRecord } from \"../types.ts\";\n\nconst runMetadataSchema = z.record(z.string().regex(/^[A-Za-z0-9_-]{1,64}$/),\n z.union([z.string().max(512), z.number(), z.boolean()])).refine((value) => Object.keys(value).length <= 32,\n \"metadata must contain at most 32 keys\");\n\nexport const runCreateSchema = z.object({\n assistant_id: z.string().min(1),\n input: jsonObjectSchema.nullable().optional(),\n config: jsonObjectSchema.nullable().default({}),\n context: jsonObjectSchema.nullable().default({}),\n checkpoint: jsonObjectSchema.nullable().optional(),\n stream: z.boolean().default(false),\n stream_mode: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n on_disconnect: z.enum([\"cancel\", \"continue\"]).nullable().optional(),\n on_completion: z.enum([\"delete\", \"keep\"]).nullable().optional(),\n multitask_strategy: z.enum([\"reject\", \"interrupt\", \"rollback\", \"enqueue\"]).nullable().optional(),\n command: jsonObjectSchema.nullable().optional(),\n interrupt_before: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n interrupt_after: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n stream_subgraphs: z.boolean().nullable().default(false),\n metadata: runMetadataSchema.nullable().optional(),\n}).superRefine((value, issue) => {\n if (value.input && Object.keys(value.input).length > 0 && value.command) issue.addIssue({ code: \"custom\", message: \"input and command are mutually exclusive\" });\n if (!value.input && !value.command && !value.checkpoint) issue.addIssue({ code: \"custom\", message: \"input, command, or checkpoint is required\" });\n}).transform((value) => value.command && value.input && Object.keys(value.input).length === 0 ? { ...value, input: null } : value);\n\nexport type RunCreate = z.infer<typeof runCreateSchema> & { ephemeral?: \"executor\" | \"wait\"; event_streaming_v2?: boolean };\n\nexport function runFromRow(row: Record<string, unknown>): RunRecord {\n return {\n run_id: String(row.run_id), thread_id: String(row.thread_id), assistant_id: String(row.assistant_id),\n status: String(row.status) as RunRecord[\"status\"], input: row.input ? asJsonObject(row.input) : null,\n output: row.output ? asJsonObject(row.output) : null,\n error_message: row.error_message === null ? null : String(row.error_message),\n config: row.config ? asJsonObject(row.config) : null, context: row.context ? asJsonObject(row.context) : null,\n user_id: String(row.user_id), created_at: new Date(String(row.created_at)).toISOString(),\n updated_at: new Date(String(row.updated_at)).toISOString(),\n };\n}\n\nfunction threadAuthorizationFilters(context: Context<{ Variables: AppVariables }>): SQL[] {\n const value = getAuthorizationValue(context);\n const metadata = asJsonObject(value.metadata);\n return [\n typeof value.thread_id === \"string\" ? eq(threads.thread_id, value.thread_id) : undefined,\n typeof value.status === \"string\" ? eq(threads.status, value.status) : undefined,\n Object.keys(metadata).length ? sql`${threads.metadata_json} @> ${JSON.stringify(metadata)}::jsonb` : undefined,\n ].filter((filter): filter is SQL => filter !== undefined);\n}\n\nasync function ownedThread(threadId: string, context: Context<{ Variables: AppVariables }>): Promise<void> {\n const rows = await db.select({ thread_id: threads.thread_id }).from(threads)\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, context.get(\"user\").identity),\n ...threadAuthorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Thread not found\");\n}\n\nasync function ownedAssistant(id: string, userId: string, authorization: JsonObject = {}): Promise<Record<string, unknown>> {\n id = assistantIdForGraph(id);\n const metadata = asJsonObject(authorization.metadata);\n const rows = await db.select().from(assistants).where(and(eq(assistants.assistant_id, id), inArray(assistants.user_id, [userId, \"system\"]),\n typeof authorization.graph_id === \"string\" ? eq(assistants.graph_id, authorization.graph_id) : undefined,\n Object.keys(metadata).length ? sql`${assistants.metadata} @> ${JSON.stringify(metadata)}::jsonb` : undefined)).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Assistant not found\");\n return rows[0];\n}\n\nasync function createRun(threadId: string, body: RunCreate, context: Context<{ Variables: AppVariables }>): Promise<RunRecord> {\n const userId = context.get(\"user\").identity;\n await validateResume(threadId, userId, body.command);\n const assistantAuthorization = await authorizeResource(context, \"assistants\", \"read\", { assistant_id: body.assistant_id });\n const assistant = await ownedAssistant(body.assistant_id, userId, assistantAuthorization);\n return db.transaction(async (transaction) => {\n const owned = await transaction.select({ thread_id: threads.thread_id, metadata: threads.metadata_json }).from(threads)\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, userId),\n ...threadAuthorizationFilters(context))).limit(1).for(\"update\");\n if (!owned[0]) throw new ApiError(404, \"Thread not found\");\n const active = await transaction.select({ run_id: runsTable.run_id }).from(runsTable).where(and(eq(runsTable.thread_id, threadId),\n eq(runsTable.user_id, userId), inArray(runsTable.status, [\"pending\", \"running\"]))).limit(1);\n if (active[0] && (body.multitask_strategy ?? \"reject\") === \"reject\") throw new ApiError(409, \"Thread already has an active run\");\n const rows = await transaction.insert(runsTable).values({ thread_id: threadId, assistant_id: String(assistant.assistant_id), input: body.input ?? null,\n config: body.config ?? {}, context: body.context ?? {}, user_id: userId, execution_params: asJsonObject(body) }).returning();\n const name = threadName(body.input ?? null);\n const threadMetadata = {\n assistant_id: String(assistant.assistant_id), graph_id: String(assistant.graph_id),\n ...(!owned[0].metadata.thread_name && name ? { thread_name: name } : {}),\n };\n await transaction.update(threads).set({ metadata_json: sql`${threads.metadata_json} || ${JSON.stringify(threadMetadata)}::jsonb`, updated_at: new Date() })\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, userId)));\n return runFromRow(rows[0] as Record<string, unknown>);\n });\n}\n\nasync function validateResume(threadId: string, userId: string, command?: JsonObject | null): Promise<void> {\n if (!command || !Object.hasOwn(command, \"resume\")) return;\n for (let attempt = 0; attempt <= 10; attempt++) {\n const row = (await db.select({ status: threads.status }).from(threads)\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, userId))).limit(1))[0];\n if (!row) throw new ApiError(404, \"Thread not found\");\n if (row.status === \"interrupted\") return;\n if (attempt < 10) await Bun.sleep(100);\n }\n throw new ApiError(400, \"Cannot resume: thread is not interrupted\");\n}\n\nexport function threadName(input: JsonObject | null): string {\n const messages = input?.messages;\n if (!Array.isArray(messages)) return \"\";\n for (const value of messages) {\n const message = asJsonObject(value);\n if (![\"human\", \"user\"].includes(String(message.role ?? message.type ?? \"\"))) continue;\n const content = typeof message.content === \"string\" ? message.content : Array.isArray(message.content)\n ? message.content.map((block) => asJsonObject(block)).filter((block) => block.type === \"text\")\n .map((block) => typeof block.text === \"string\" ? block.text : \"\").join(\" \")\n : \"\";\n const name = content.trim();\n return name.length > 100 ? `${name.slice(0, 97).trimEnd()}...` : name;\n }\n return \"\";\n}\n\nfunction invocationInput(body: RunCreate): unknown {\n if (body.command) return new Command(body.command as ConstructorParameters<typeof Command>[0]);\n return body.input ?? null;\n}\n\nfunction requestedStreamModes(body: RunCreate): string[] {\n if (Array.isArray(body.stream_mode)) return body.stream_mode;\n if (typeof body.stream_mode === \"string\") return [body.stream_mode];\n return [...DEFAULT_STREAM_MODES];\n}\n\ninterface StreamResult {\n last: unknown;\n interrupted: boolean;\n}\n\n/** Legacy (v1) producer: seven stream modes, `{run_id}_event_{seq}` ids. */\nasync function streamLegacy(\n record: RunRecord,\n body: RunCreate,\n graph: Awaited<ReturnType<typeof getGraph>>,\n user: AuthUser,\n options: { config: JsonObject; context: JsonObject },\n abortController: AbortController,\n): Promise<StreamResult> {\n const channel = `aegra:run:${record.run_id}`;\n let last: unknown = null;\n let interrupted = false;\n for await (const event of streamRunEvents({\n graph,\n config: {\n ...options.config,\n context: options.context,\n store: graph.store ?? new AegraStore(user),\n interruptBefore: body.interrupt_before,\n interruptAfter: body.interrupt_after,\n signal: abortController.signal,\n },\n input: invocationInput(body),\n runId: record.run_id,\n streamMode: requestedStreamModes(body),\n subgraphs: body.stream_subgraphs ?? false,\n })) {\n if (event.event === \"values\" || event.event === \"updates\") {\n if (payloadHasInterrupt(event.data)) interrupted = true;\n if (event.event === \"values\") last = event.data;\n }\n await publish(channel, { event: event.event, id: await allocateRunEventId(record.run_id), data: asJsonValue(event.data) });\n }\n return { last, interrupted };\n}\n\n/** Agent Protocol v2 producer: native v3 events feed the thread stream and the run stream. */\nasync function streamNativeV2(\n record: RunRecord,\n body: RunCreate,\n graph: Awaited<ReturnType<typeof getGraph>>,\n user: AuthUser,\n options: { config: JsonObject; context: JsonObject },\n abortController: AbortController,\n): Promise<StreamResult> {\n const channel = `aegra:run:${record.run_id}`;\n const requested = new Set(requestedStreamModes(body));\n const source = await graph.stream(invocationInput(body), {\n ...options.config,\n context: options.context,\n store: graph.store ?? new AegraStore(user),\n streamMode: STREAM_EVENTS_V3_MODES,\n subgraphs: true,\n interruptBefore: body.interrupt_before,\n interruptAfter: body.interrupt_after,\n signal: abortController.signal,\n });\n const runStream = createGraphRunStream(source as Parameters<typeof createGraphRunStream>[0], [], { abortController });\n let last: unknown = null;\n for await (const event of runStream) {\n if (event.method === \"values\") last = event.params.data;\n await publishProtocolEvent(record.thread_id, record.run_id, record.user_id, event);\n if (requested.has(event.method)) {\n const payload = asJsonValue(event);\n await publish(channel, { event: event.method, id: await allocateRunEventId(record.run_id), data: payload });\n }\n }\n return { last, interrupted: runStream.interrupted };\n}\n\nconst activeRuns = new Map<string, AbortController>();\nlet cancellationSubscriber: ReturnType<NonNullable<ReturnType<typeof getRedis>>[\"duplicate\"]> | undefined;\n\nexport async function setThreadStatusIfNoActiveRuns(threadId: string, userId: string, status: string): Promise<void> {\n const active = db.select({ value: sql`1` }).from(runsTable).where(and(eq(runsTable.thread_id, threads.thread_id),\n eq(runsTable.user_id, userId), inArray(runsTable.status, [\"pending\", \"running\"])));\n await db.update(threads).set({ status, updated_at: new Date() }).where(and(eq(threads.thread_id, threadId),\n eq(threads.user_id, userId), notExists(active)));\n}\n\nexport function graphInvocationOptions(\n assistant: Record<string, unknown>,\n body: RunCreate,\n user: AuthUser,\n threadId: string,\n): { config: JsonObject; context: JsonObject } {\n const assistantConfig = asJsonObject(assistant.config);\n const requestConfig = body.config ?? {};\n if ((assistantConfig.configurable !== undefined && (typeof assistantConfig.configurable !== \"object\" || Array.isArray(assistantConfig.configurable)))\n || (requestConfig.configurable !== undefined && (typeof requestConfig.configurable !== \"object\" || Array.isArray(requestConfig.configurable)))) {\n throw new ApiError(422, \"config.configurable must be an object\");\n }\n const requestContext = Object.keys(body.context ?? {}).length ? body.context ?? {} : asJsonObject(requestConfig.configurable);\n const configurable = {\n ...asJsonObject(assistantConfig.configurable),\n ...asJsonObject(requestConfig.configurable),\n ...(body.checkpoint ?? {}),\n thread_id: threadId,\n checkpoint_ns: typeof body.checkpoint?.checkpoint_ns === \"string\" ? body.checkpoint.checkpoint_ns : \"\",\n langgraph_auth_user: asJsonObject(user),\n };\n return {\n config: { ...assistantConfig, ...requestConfig, configurable },\n context: { ...asJsonObject(assistant.context), ...requestContext },\n };\n}\n\nexport async function executeRun(record: RunRecord, body: RunCreate, user: AuthUser, workerId?: string): Promise<void> {\n const channel = `aegra:run:${record.run_id}`;\n const abortController = new AbortController();\n const timeout = setTimeout(() => abortController.abort(\"timeout\"), settings.BG_JOB_TIMEOUT_SECS * 1000);\n let heartbeat: Timer | undefined;\n let started = false;\n activeRuns.set(record.run_id, abortController);\n try {\n const claimed = await db.update(runsTable).set({ status: \"running\", claimed_by: workerId ?? null,\n lease_expires_at: workerId ? new Date(Date.now() + settings.LEASE_DURATION_SECONDS * 1000) : null, updated_at: new Date() })\n .where(and(eq(runsTable.run_id, record.run_id), eq(runsTable.status, \"pending\"))).returning({ run_id: runsTable.run_id });\n if (!claimed[0]) return;\n started = true;\n if (workerId) heartbeat = setInterval(() => void db.update(runsTable)\n .set({ lease_expires_at: new Date(Date.now() + settings.LEASE_DURATION_SECONDS * 1000) })\n .where(and(eq(runsTable.run_id, record.run_id), eq(runsTable.status, \"running\"), eq(runsTable.claimed_by, workerId))),\n settings.HEARTBEAT_INTERVAL_SECONDS * 1000);\n await db.update(threads).set({ status: \"busy\", updated_at: new Date() })\n .where(and(eq(threads.thread_id, record.thread_id), eq(threads.user_id, record.user_id)));\n const assistant = await ownedAssistant(record.assistant_id, record.user_id);\n const options = graphInvocationOptions(assistant, body, user, record.thread_id);\n const graph = await getGraph(String(assistant.graph_id), {\n user, context: options.context, accessContext: \"threads.create_run\", config: options.config,\n });\n const { last, interrupted } = await withRunTrace(record.run_id, record.thread_id, String(assistant.graph_id), record.user_id,\n body.metadata ?? {}, async () => {\n if (body.event_streaming_v2) return await streamNativeV2(record, body, graph, user, options, abortController);\n return await streamLegacy(record, body, graph, user, options, abortController);\n });\n const status = interrupted ? \"interrupted\" : \"success\";\n const output = asJsonObject(last);\n await db.update(runsTable).set({ status, output, claimed_by: null, lease_expires_at: null, updated_at: new Date() })\n .where(and(eq(runsTable.run_id, record.run_id), eq(runsTable.status, \"running\")));\n await setThreadStatusIfNoActiveRuns(record.thread_id, record.user_id, interrupted ? \"interrupted\" : \"idle\");\n await publish(channel, { event: \"end\", id: await allocateRunEventId(record.run_id), data: { status } });\n } catch (error) {\n const shuttingDown = abortController.signal.reason === \"shutdown\";\n const timedOut = abortController.signal.reason === \"timeout\";\n const cancelled = abortController.signal.aborted && !timedOut;\n const message = error instanceof Error ? error.message : String(error);\n if (shuttingDown) {\n await db.update(runsTable).set({ status: \"pending\", claimed_by: null, lease_expires_at: null, updated_at: new Date() })\n .where(and(eq(runsTable.run_id, record.run_id), eq(runsTable.status, \"running\")));\n return;\n }\n const status = timedOut ? \"timeout\" : cancelled ? \"interrupted\" : \"error\";\n await db.update(runsTable).set({ status, error_message: cancelled ? null : message, claimed_by: null,\n lease_expires_at: null, updated_at: new Date() }).where(and(eq(runsTable.run_id, record.run_id),\n inArray(runsTable.status, [\"pending\", \"running\"])));\n await setThreadStatusIfNoActiveRuns(record.thread_id, record.user_id, status === \"timeout\" ? \"error\" : status);\n await publishProtocolEvent(record.thread_id, record.run_id, record.user_id, {\n method: \"lifecycle\",\n params: { namespace: [], data: { event: cancelled ? \"interrupted\" : \"failed\", ...(cancelled ? {} : { error: message }) } },\n });\n await publish(channel, cancelled\n ? { event: \"end\", id: await allocateRunEventId(record.run_id), data: { status } }\n : { event: \"error\", id: await allocateRunEventId(record.run_id), data: { error: \"Error\", message } });\n // The FastAPI producer always closed the stream with `end`, even after `error`.\n if (status !== \"interrupted\") {\n await publish(channel, { event: \"end\", id: await allocateRunEventId(record.run_id), data: { status: \"error\" } });\n }\n } finally {\n clearTimeout(timeout);\n if (heartbeat) clearInterval(heartbeat);\n activeRuns.delete(record.run_id);\n if (started && body.ephemeral === \"executor\" && body.on_completion !== \"keep\") {\n await deleteEphemeralThread(record.thread_id, record.user_id);\n }\n }\n}\n\nexport async function startCancellationListener(): Promise<void> {\n if (cancellationSubscriber) return;\n const connection = await createRedisConnection();\n if (!connection) return;\n cancellationSubscriber = connection;\n cancellationSubscriber.on(\"message\", (_channel: string, runId: string) => activeRuns.get(runId)?.abort(\"cancelled\"));\n await cancellationSubscriber.subscribe(\"aegra:cancel\");\n}\n\nexport async function stopCancellationListener(): Promise<void> {\n if (cancellationSubscriber) {\n try { await cancellationSubscriber.quit(); }\n catch (error) { console.warn(\"Redis cancellation listener shutdown failed\", error); }\n }\n cancellationSubscriber = undefined;\n}\n\nexport async function cancelActiveRun(runId: string, reason: \"cancelled\" | \"shutdown\" = \"cancelled\"): Promise<void> {\n activeRuns.get(runId)?.abort(reason);\n if (reason === \"shutdown\") return;\n const redis = getRedis();\n if (redis) {\n try { await redis.publish(\"aegra:cancel\", runId); }\n catch (error) { console.warn(\"Redis cancellation publish failed; local cancellation retained\", error); }\n }\n}\n\nasync function requestRunInterruption(threadId: string, runId: string, userId: string): Promise<RunRecord> {\n const current = await db.select().from(runsTable).where(and(eq(runsTable.run_id, runId),\n eq(runsTable.thread_id, threadId), eq(runsTable.user_id, userId))).limit(1);\n if (!current[0]) throw new ApiError(404, \"Run not found\");\n if ([\"pending\", \"running\"].includes(String(current[0].status))) {\n const now = new Date();\n const reconciled = await db.update(runsTable).set({ status: \"interrupted\", claimed_by: null,\n lease_expires_at: null, updated_at: now }).where(and(eq(runsTable.run_id, runId),\n inArray(runsTable.status, [\"pending\", \"running\"]), or(isNull(runsTable.claimed_by), lt(runsTable.lease_expires_at, now))))\n .returning();\n if (reconciled[0]) await setThreadStatusIfNoActiveRuns(threadId, userId, \"interrupted\");\n await cancelActiveRun(runId);\n }\n const row = await db.select().from(runsTable).where(and(eq(runsTable.run_id, runId), eq(runsTable.user_id, userId))).limit(1);\n return runFromRow(row[0] as Record<string, unknown>);\n}\n\nasync function deleteEphemeralThread(threadId: string, userId: string): Promise<void> {\n await deleteThreadCheckpoints(threadId);\n await db.delete(threads).where(and(eq(threads.thread_id, threadId), eq(threads.user_id, userId)));\n}\n\nexport async function createAndDispatchRun(\n context: Context<{ Variables: AppVariables }>,\n threadId: string,\n body: RunCreate,\n allowCreateThread = false,\n): Promise<RunRecord> {\n if (allowCreateThread) {\n const owner = await db.select({ user_id: threads.user_id }).from(threads).where(eq(threads.thread_id, threadId)).limit(1);\n if (owner[0] && String(owner[0].user_id) !== context.get(\"user\").identity) throw new ApiError(404, \"Thread not found\");\n if (!owner[0]) {\n await db.insert(threads).values({ thread_id: threadId,\n metadata_json: initialThreadMetadata(context.get(\"user\").identity), user_id: context.get(\"user\").identity })\n .onConflictDoNothing();\n await ownedThread(threadId, context);\n }\n }\n const record = await createRun(threadId, body, context);\n await dispatchRun(record, body, context.get(\"user\"));\n return record;\n}\n\nexport async function dispatchRun(record: RunRecord, body: RunCreate, user: AuthUser): Promise<void> {\n const redis = getRedis();\n if (redis) {\n try { await redis.rpush(settings.WORKER_QUEUE_KEY, record.run_id); }\n catch (error) {\n console.warn(\"Redis run dispatch failed; executing locally\", error);\n void executeRun(record, body, user);\n }\n return;\n }\n void executeRun(record, body, user);\n}\n\nasync function runResponse(context: Context<{ Variables: AppVariables }>, threadId: string, body: RunCreate, stream: boolean): Promise<Response> {\n const record = await createAndDispatchRun(context, threadId, body, true);\n if (stream) {\n context.header(\"Location\", `/threads/${threadId}/runs/${record.run_id}`);\n context.header(\"Content-Location\", `/threads/${threadId}/runs/${record.run_id}`);\n return sseResponse(context, `aegra:run:${record.run_id}`,\n body.on_disconnect === \"continue\" ? undefined : () => cancelActiveRun(record.run_id));\n }\n return context.json(record);\n}\n\nasync function waitForRun(runId: string, userId: string, timeoutMs = 3_600_000): Promise<RunRecord> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const rows = await db.select().from(runsTable).where(and(eq(runsTable.run_id, runId), eq(runsTable.user_id, userId))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Run not found\");\n const current = runFromRow(rows[0]);\n if (TERMINAL_RUN_STATUSES.has(current.status)) return current;\n await Bun.sleep(100);\n }\n throw new ApiError(408, \"Run wait timed out\");\n}\n\n/** Terminal states `/wait` and `/join` stop at, matching the FastAPI waiters. */\nconst TERMINAL_RUN_STATUSES = new Set([\"success\", \"error\", \"interrupted\", \"timeout\"]);\n\n/**\n * Wait for a run while keeping the HTTP connection alive.\n *\n * Proxies and load balancers drop idle connections, so the body streams a\n * `\\n` heartbeat every keepalive interval and finishes with the run output.\n * Leading whitespace is ignored by JSON parsers, so clients parse the\n * concatenated body normally.\n */\nfunction heartbeatWaitResponse(\n runId: string,\n userId: string,\n headers: Record<string, string> = {},\n onComplete?: (record: RunRecord) => Promise<void>,\n): Response {\n const encoder = new TextEncoder();\n const body = new ReadableStream<Uint8Array>({\n async start(controller) {\n const deadline = Date.now() + settings.BG_JOB_TIMEOUT_SECS * 1000;\n let lastPing = Date.now();\n try {\n while (Date.now() < deadline) {\n const rows = await db.select().from(runsTable)\n .where(and(eq(runsTable.run_id, runId), eq(runsTable.user_id, userId))).limit(1);\n const current = rows[0] ? runFromRow(rows[0]) : undefined;\n if (!current || TERMINAL_RUN_STATUSES.has(current.status)) {\n if (current) await onComplete?.(current);\n controller.enqueue(encoder.encode(JSON.stringify(current?.output ?? {})));\n break;\n }\n if (Date.now() - lastPing >= settings.KEEPALIVE_INTERVAL_SECS * 1000) {\n controller.enqueue(encoder.encode(\"\\n\"));\n lastPing = Date.now();\n }\n await Bun.sleep(100);\n }\n } catch (error) {\n console.error(\"run wait stream failed\", error);\n } finally {\n controller.close();\n }\n },\n });\n return new Response(body, { headers: { \"content-type\": \"application/json\", ...headers } });\n}\n\nexport const runRoutes = new Hono<{ Variables: AppVariables }>();\n\nrunRoutes.post(\"/threads/:threadId/runs\", async (context) => runResponse(context, context.req.param(\"threadId\"), await parseJson(context, runCreateSchema), false));\nrunRoutes.post(\"/threads/:threadId/runs/stream\", async (context) => runResponse(context, context.req.param(\"threadId\"), await parseJson(context, runCreateSchema), true));\n\nrunRoutes.get(\"/threads/:threadId/runs/:runId\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const rows = await db.select().from(runsTable).where(and(eq(runsTable.run_id, context.req.param(\"runId\")),\n eq(runsTable.thread_id, context.req.param(\"threadId\")), eq(runsTable.user_id, context.get(\"user\").identity))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Run not found\");\n return context.json(runFromRow(rows[0]));\n});\n\nrunRoutes.get(\"/threads/:threadId/runs\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const limit = clampLimit(context.req.query(\"limit\"), 10);\n const offset = parseOffset(context.req.query(\"offset\"));\n const status = context.req.query(\"status\");\n if (status && ![\"pending\", \"running\", \"error\", \"success\", \"timeout\", \"interrupted\"].includes(status)) {\n throw new ApiError(422, \"Invalid run status\");\n }\n const rows = await db.select().from(runsTable).where(and(eq(runsTable.thread_id, context.req.param(\"threadId\")),\n eq(runsTable.user_id, context.get(\"user\").identity), status ? eq(runsTable.status, status) : undefined))\n .orderBy(desc(runsTable.created_at)).limit(limit).offset(offset);\n return context.json(rows.map((row) => runFromRow(row)));\n});\n\nrunRoutes.patch(\"/threads/:threadId/runs/:runId\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n await parseJson(context, z.object({ status: z.literal(\"interrupted\") }));\n return context.json(await requestRunInterruption(context.req.param(\"threadId\"), context.req.param(\"runId\"), context.get(\"user\").identity));\n});\n\nrunRoutes.get(\"/threads/:threadId/runs/:runId/join\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const runId = context.req.param(\"runId\");\n const userId = context.get(\"user\").identity;\n const existing = await db.select().from(runsTable).where(and(eq(runsTable.run_id, runId),\n eq(runsTable.thread_id, context.req.param(\"threadId\")), eq(runsTable.user_id, userId))).limit(1);\n if (!existing[0]) throw new ApiError(404, `Run '${runId}' not found`);\n const record = runFromRow(existing[0]);\n if (TERMINAL_RUN_STATUSES.has(record.status)) return context.json(record.output ?? {});\n return heartbeatWaitResponse(runId, userId, {\n Location: `/threads/${context.req.param(\"threadId\")}/runs/${runId}/join`,\n \"Content-Location\": `/threads/${context.req.param(\"threadId\")}/runs/${runId}`,\n ...(context.req.query(\"cancel_on_disconnect\") === \"1\" ? {} : {}),\n });\n});\n\nrunRoutes.post(\"/threads/:threadId/runs/wait\", async (context) => {\n const body = await parseJson(context, runCreateSchema);\n const threadId = context.req.param(\"threadId\");\n const record = await createAndDispatchRun(context, threadId, body, true);\n return heartbeatWaitResponse(record.run_id, record.user_id, {\n Location: `/threads/${threadId}/runs/${record.run_id}/join`,\n \"Content-Location\": `/threads/${threadId}/runs/${record.run_id}`,\n });\n});\n\nrunRoutes.get(\"/threads/:threadId/runs/:runId/stream\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const rows = await db.select({ run_id: runsTable.run_id, status: runsTable.status }).from(runsTable).where(and(eq(runsTable.run_id, context.req.param(\"runId\")),\n eq(runsTable.thread_id, context.req.param(\"threadId\")), eq(runsTable.user_id, context.get(\"user\").identity))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Run not found\");\n const terminal = TERMINAL_RUN_STATUSES.has(String(rows[0].status));\n return sseResponse(context, `aegra:run:${context.req.param(\"runId\")}`, undefined,\n terminal ? { event: \"end\", data: { status: String(rows[0].status) } } : undefined);\n});\n\nrunRoutes.post(\"/threads/:threadId/runs/:runId/cancel\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const action = context.req.query(\"action\") ?? \"cancel\";\n const wait = context.req.query(\"wait\") ?? \"0\";\n if (![\"cancel\", \"interrupt\"].includes(action) || ![\"0\", \"1\"].includes(wait)) throw new ApiError(422, \"Invalid cancellation options\");\n let row = await requestRunInterruption(context.req.param(\"threadId\"), context.req.param(\"runId\"), context.get(\"user\").identity);\n if (wait === \"1\" && [\"pending\", \"running\"].includes(row.status)) {\n row = await waitForRun(row.run_id, row.user_id, 10_000).catch(() => row);\n }\n return context.json(row);\n});\n\nrunRoutes.delete(\"/threads/:threadId/runs/:runId\", async (context) => {\n await ownedThread(context.req.param(\"threadId\"), context);\n const id = context.req.param(\"runId\");\n const existing = await db.select().from(runsTable).where(and(eq(runsTable.run_id, id),\n eq(runsTable.thread_id, context.req.param(\"threadId\")), eq(runsTable.user_id, context.get(\"user\").identity))).limit(1);\n if (!existing[0]) throw new ApiError(404, \"Run not found\");\n const force = context.req.query(\"force\") === \"1\";\n if ([\"pending\", \"running\"].includes(String(existing[0].status)) && !force) throw new ApiError(409, \"Run is active. Retry with force=1\");\n if (force) await cancelActiveRun(id);\n const rows = await db.delete(runsTable).where(and(eq(runsTable.run_id, context.req.param(\"runId\")),\n eq(runsTable.thread_id, context.req.param(\"threadId\")), eq(runsTable.user_id, context.get(\"user\").identity)))\n .returning({ run_id: runsTable.run_id });\n if (!rows[0]) throw new ApiError(404, \"Run not found\");\n return context.body(null, 204);\n});\n\nasync function stateless(context: Context<{ Variables: AppVariables }>, mode: \"run\" | \"wait\" | \"stream\"): Promise<Response> {\n const parsed = await parseJson(context, runCreateSchema);\n const body: RunCreate = { ...parsed, ephemeral: mode === \"wait\" ? \"wait\" : \"executor\" };\n const threadId = crypto.randomUUID();\n const userId = context.get(\"user\").identity;\n await db.insert(threads).values({ thread_id: threadId, metadata_json: initialThreadMetadata(userId), user_id: userId });\n let created = false;\n try {\n const record = await createRun(threadId, body, context);\n created = true;\n await dispatchRun(record, body, context.get(\"user\"));\n if (mode === \"run\") return context.json(record);\n if (mode === \"stream\") {\n context.header(\"Location\", `/threads/${threadId}/runs/${record.run_id}`);\n context.header(\"Content-Location\", `/threads/${threadId}/runs/${record.run_id}`);\n return sseResponse(context, `aegra:run:${record.run_id}`,\n body.on_disconnect === \"continue\" ? undefined : () => cancelActiveRun(record.run_id));\n }\n if (mode === \"wait\") {\n return heartbeatWaitResponse(record.run_id, record.user_id, {}, async () => {\n if (body.on_completion !== \"keep\") await deleteEphemeralThread(threadId, userId);\n });\n }\n return context.json(record);\n } catch (error) {\n if (!created) await deleteEphemeralThread(threadId, userId);\n throw error;\n }\n}\n\nrunRoutes.post(\"/runs\", (context) => stateless(context, \"run\"));\nrunRoutes.post(\"/runs/wait\", (context) => stateless(context, \"wait\"));\nrunRoutes.post(\"/runs/stream\", (context) => stateless(context, \"stream\"));\n",
22
+ "import Redis from \"ioredis\";\nimport { settings } from \"../config/settings.ts\";\n\nlet redis: Redis | undefined;\n\nexport function getRedis(): Redis | undefined {\n if (!settings.REDIS_BROKER_ENABLED) return undefined;\n if (!redis) {\n redis = new Redis(settings.REDIS_URL, { lazyConnect: true, enableOfflineQueue: false, maxRetriesPerRequest: 1 });\n redis.on(\"error\", () => { /* command callers own fallback logging */ });\n }\n return redis;\n}\n\nexport async function connectRedis(): Promise<void> {\n const client = getRedis();\n if (client?.status === \"wait\") await client.connect();\n if (client) await client.ping();\n}\n\nexport async function pingRedis(): Promise<boolean> {\n const client = getRedis();\n if (!client) return true;\n try {\n return (await client.ping()) === \"PONG\";\n } catch {\n return false;\n }\n}\n\nexport async function closeRedis(): Promise<void> {\n const client = getRedis();\n if (client && client.status !== \"end\") await client.quit();\n}\n\n/**\n * A second, connected connection for blocking/subscribing commands.\n * `duplicate()` inherits `lazyConnect`, so a duplicate must be connected\n * explicitly or every subscribe/BLPOP fails silently. `enableOfflineQueue`\n * is re-enabled because the base client's fast-fail mode rejects subscribe\n * whenever it is not yet `ready`.\n */\nexport async function createRedisConnection(): Promise<Redis | undefined> {\n const base = getRedis();\n if (!base) return undefined;\n if (base.status === \"wait\") await base.connect();\n const client = base.duplicate({ enableOfflineQueue: true });\n client.on(\"error\", () => { /* command callers own fallback logging */ });\n if (client.status === \"wait\") await client.connect();\n if (client.status !== \"ready\") {\n await new Promise<void>((resolve, reject) => {\n const onReady = (): void => { client.off(\"error\", onError); resolve(); };\n const onError = (error: Error): void => { client.off(\"ready\", onReady); reject(error); };\n client.once(\"ready\", onReady);\n client.once(\"error\", onError);\n });\n }\n return client;\n}\n",
23
+ "import type Redis from \"ioredis\";\nimport { settings } from \"../config/settings.ts\";\nimport { createRedisConnection, getRedis } from \"../core/redis.ts\";\nimport type { EventEnvelope } from \"../types.ts\";\n\nconst enc = new TextEncoder();\nconst localSubscribers = new Map<string, Set<(event: EventEnvelope) => void>>();\nconst replay = new Map<string, EventEnvelope[]>();\nconst maxReplayEvents = 1000;\nconst replayTtlSeconds = 600;\n\nexport async function publish(channel: string, event: EventEnvelope): Promise<void> {\n const history = replay.get(channel) ?? [];\n history.push(event);\n if (history.length > maxReplayEvents) history.splice(0, history.length - maxReplayEvents);\n replay.set(channel, history);\n for (const subscriber of localSubscribers.get(channel) ?? []) subscriber(event);\n const redis = getRedis();\n if (redis) {\n const payload = JSON.stringify(event);\n const key = `aegra:replay:${channel}`;\n try {\n await redis.multi().rpush(key, payload).ltrim(key, -maxReplayEvents, -1).expire(key, replayTtlSeconds)\n .publish(channel, payload).exec();\n } catch (error) {\n console.warn(\"Redis event publish failed; local delivery retained\", error);\n }\n }\n}\n\nexport async function getReplay(channel: string, afterId?: string): Promise<EventEnvelope[]> {\n const redis = getRedis();\n let history = replay.get(channel) ?? [];\n if (redis) {\n try { history = (await redis.lrange(`aegra:replay:${channel}`, 0, -1)).map((payload) => JSON.parse(payload) as EventEnvelope); }\n catch (error) { console.warn(\"Redis event replay failed; using local replay\", error); }\n }\n if (!afterId) return history;\n // Legacy run streams resume on `{run_id}_event_{seq}` ids, where the event\n // may already be evicted from the buffer — the sequence is the cursor.\n const after = eventSequence(afterId);\n if (after > 0) return history.filter((event) => eventSequence(event.id) > after);\n const index = history.findIndex((event) => event.id === afterId);\n return index < 0 ? history : history.slice(index + 1);\n}\n\nconst runSequences = new Map<string, number>();\n\n/** Sequence carried by `{run_id}_event_{seq}` ids, which clients echo back as `Last-Event-ID`. */\nexport function eventSequence(eventId: string | undefined): number {\n if (!eventId) return 0;\n const index = eventId.lastIndexOf(\"_event_\");\n if (index < 0) return 0;\n const parsed = Number(eventId.slice(index + \"_event_\".length));\n return Number.isInteger(parsed) && parsed > 0 ? parsed : 0;\n}\n\n/** Allocate the next run-scoped event id, ordered across instances through Redis. */\nexport async function allocateRunEventId(runId: string): Promise<string> {\n const redis = getRedis();\n let sequence: number | undefined;\n if (redis) {\n try {\n const key = `aegra:seq:run:${runId}`;\n sequence = await redis.incr(key);\n await redis.expire(key, 3600);\n } catch (error) {\n console.warn(\"Redis event sequence allocation failed; using local ordering\", error);\n }\n }\n sequence ??= (runSequences.get(runId) ?? 0) + 1;\n if (sequence > (runSequences.get(runId) ?? 0)) runSequences.set(runId, sequence);\n return `${runId}_event_${sequence}`;\n}\n\nexport async function subscribe(channel: string): Promise<ReadableStream<Uint8Array>> {\n let cleanup: (() => void) | undefined;\n let ready: Promise<unknown> = Promise.resolve();\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n const emit = (event: EventEnvelope): void => {\n const id = event.id ? `\\nid: ${event.id}` : \"\";\n controller.enqueue(enc.encode(`event: ${event.event}\\ndata: ${JSON.stringify(event.data)}${id}\\n\\n`));\n };\n let redisSubscriber: Redis | undefined;\n const subscribers = localSubscribers.get(channel) ?? new Set();\n subscribers.add(emit);\n localSubscribers.set(channel, subscribers);\n ready = (async () => {\n redisSubscriber = await createRedisConnection();\n if (!redisSubscriber) return;\n redisSubscriber.on(\"message\", (_channel: string, payload: string) => {\n let event: EventEnvelope;\n try { event = JSON.parse(payload) as EventEnvelope; }\n catch { return; }\n if (!replay.get(channel)?.some((local) => local.id && local.id === event.id)) emit(event);\n });\n await redisSubscriber.subscribe(channel);\n })().catch((error: unknown) => {\n console.warn(\"Redis event subscription failed; using local delivery\", error);\n });\n const ping = setInterval(() => controller.enqueue(enc.encode(\": ping\\n\\n\")), settings.KEEPALIVE_INTERVAL_SECS * 1000);\n cleanup = () => {\n clearInterval(ping);\n const subscribers = localSubscribers.get(channel);\n subscribers?.delete(emit);\n if (subscribers?.size === 0) localSubscribers.delete(channel);\n if (redisSubscriber) void redisSubscriber.quit();\n };\n },\n cancel() {\n cleanup?.();\n },\n });\n await ready;\n return stream;\n}\n",
24
+ "import { context, createContextKey, SpanStatusCode, trace, type Attributes, type Context } from \"@opentelemetry/api\";\nimport { LangChainInstrumentation } from \"@arizeai/openinference-instrumentation-langchain\";\nimport * as CallbackManagerModule from \"@langchain/core/callbacks/manager\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { defaultResource, resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor, ConsoleSpanExporter, type ReadableSpan, type Span, type SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { settings } from \"./config/settings.ts\";\nimport type { JsonObject, JsonValue } from \"./types.ts\";\n\nconst runAttributesKey = createContextKey(\"aegra.run.attributes\");\nlet sdk: NodeSDK | undefined;\n\nclass RunAttributeProcessor implements SpanProcessor {\n onStart(span: Span, parentContext: Context): void {\n const attributes = parentContext.getValue(runAttributesKey) as Attributes | undefined;\n if (attributes) span.setAttributes(attributes);\n }\n\n onEnd(_span: ReadableSpan): void {}\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n\nfunction parseHeaders(value?: string): Record<string, string> {\n return Object.fromEntries((value ?? \"\").split(\",\").flatMap((item) => {\n const separator = item.indexOf(\"=\");\n return separator < 0 ? [] : [[item.slice(0, separator).trim(), item.slice(separator + 1).trim()]];\n }).filter(([key]) => key));\n}\n\nexport function configuredExporters(): OTLPTraceExporter[] {\n const exporters: OTLPTraceExporter[] = [];\n for (const target of new Set(settings.OTEL_TARGETS.split(\",\").map((value) => value.trim().toUpperCase()).filter(Boolean))) {\n if ([\"GENERIC\", \"DEFAULT\", \"OTLP\"].includes(target)) {\n if (settings.OTEL_EXPORTER_OTLP_ENDPOINT) exporters.push(new OTLPTraceExporter({\n url: settings.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: parseHeaders(settings.OTEL_EXPORTER_OTLP_HEADERS),\n }));\n } else if (target === \"LANGFUSE\") {\n if (settings.LANGFUSE_PUBLIC_KEY && settings.LANGFUSE_SECRET_KEY) exporters.push(new OTLPTraceExporter({\n url: `${settings.LANGFUSE_BASE_URL.replace(/\\/$/, \"\")}/api/public/otel/v1/traces`,\n headers: {\n Authorization: `Basic ${Buffer.from(`${settings.LANGFUSE_PUBLIC_KEY}:${settings.LANGFUSE_SECRET_KEY}`).toString(\"base64\")}`,\n \"x-langfuse-ingestion-version\": \"4\",\n },\n }));\n } else if (target === \"PHOENIX\") {\n exporters.push(new OTLPTraceExporter({\n url: settings.PHOENIX_COLLECTOR_ENDPOINT,\n headers: settings.PHOENIX_API_KEY ? { authorization: `Bearer ${settings.PHOENIX_API_KEY}` } : {},\n }));\n } else {\n console.warn(`Unknown OTEL target: ${target}`);\n }\n }\n return exporters;\n}\n\nexport function startObservability(): void {\n if (sdk) return;\n try {\n const processors: SpanProcessor[] = [new RunAttributeProcessor()];\n processors.push(...configuredExporters().map((exporter) => new BatchSpanProcessor(exporter)));\n if (settings.OTEL_CONSOLE_EXPORT) processors.push(new BatchSpanProcessor(new ConsoleSpanExporter()));\n if (processors.length === 1) return;\n const candidate = new NodeSDK({\n resource: defaultResource().merge(resourceFromAttributes({\n \"service.name\": settings.OTEL_SERVICE_NAME,\n \"service.version\": settings.VERSION,\n \"deployment.environment\": settings.ENV_MODE.toLowerCase(),\n })),\n spanProcessors: processors,\n });\n candidate.start();\n sdk = candidate;\n try { new LangChainInstrumentation().manuallyInstrument(CallbackManagerModule); }\n catch (error) { console.error(\"LangChain OpenTelemetry instrumentation failed\", error); }\n console.log(\"OpenTelemetry tracing enabled\");\n } catch (error) {\n console.error(\"OpenTelemetry initialization failed\", error);\n }\n}\n\nexport async function stopObservability(): Promise<void> {\n if (!sdk) return;\n await sdk.shutdown();\n sdk = undefined;\n}\n\nfunction primitive(value: JsonValue): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nexport function runTraceAttributes(\n runId: string,\n threadId: string,\n graphId: string,\n userId: string | undefined,\n metadata: JsonObject = {},\n): Attributes {\n const attributes: Attributes = {\n \"langfuse.session.id\": threadId,\n \"session.id\": threadId,\n \"langfuse.trace.name\": graphId,\n \"langfuse.trace.metadata.run_id\": runId,\n \"langfuse.trace.metadata.thread_id\": threadId,\n \"langfuse.trace.metadata.graph_id\": graphId,\n };\n if (userId) {\n attributes[\"langfuse.user.id\"] = userId;\n attributes[\"user.id\"] = userId;\n }\n for (const [key, value] of Object.entries(metadata)) {\n if (primitive(value) && ![\"run_id\", \"thread_id\", \"graph_id\"].includes(key)) {\n attributes[`langfuse.trace.metadata.${key}`] = value;\n }\n }\n return attributes;\n}\n\nexport async function withRunTrace<T>(\n runId: string,\n threadId: string,\n graphId: string,\n userId: string | undefined,\n metadata: JsonObject,\n operation: () => Promise<T>,\n): Promise<T> {\n if (!sdk) return operation();\n const attributes = runTraceAttributes(runId, threadId, graphId, userId, metadata);\n const runContext = context.active().setValue(runAttributesKey, attributes);\n return context.with(runContext, () => trace.getTracer(\"aegra\").startActiveSpan(`graph ${graphId}`, { attributes }, async (span) => {\n try {\n const result = await operation();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error instanceof Error ? error : String(error));\n span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });\n throw error;\n } finally {\n span.end();\n }\n }));\n}\n",
25
+ "/**\n * Wire serialization for LangChain values.\n *\n * Python's `GeneralSerializer` called `.dict()` on LangChain objects, which\n * produced flat message dicts (`type`, `content`, `id`, ...). The JavaScript\n * classes expose `toDict()` as `{type, data}`, and raw JSON.stringify turns a\n * message into `{lc, kwargs}`. Both differ from the wire shape SDK clients\n * were built against, so messages are flattened here.\n */\n\nfunction isMessage(value: unknown): value is Record<string, unknown> & { content: unknown } {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (!(\"content\" in record)) return false;\n if (typeof record._getType === \"function\") return true;\n return Array.isArray(record.lc_namespace) && record.lc_namespace.includes(\"messages\");\n}\n\n/** Chunks keep their class name in `type`, matching Python's `AIMessageChunk` dicts. */\nfunction messageType(record: Record<string, unknown>, fallback: unknown): unknown {\n const name = record.constructor?.name;\n if (typeof name === \"string\" && name.endsWith(\"Chunk\") && name !== \"BaseMessageChunk\") return name;\n return fallback;\n}\n\nfunction serializeMessage(record: Record<string, unknown>): Record<string, unknown> {\n const source = typeof record.toDict === \"function\" ? (record as { toDict(): unknown }).toDict() : undefined;\n const dict = source && typeof source === \"object\" ? source as Record<string, unknown> : undefined;\n const data = dict?.data && typeof dict.data === \"object\" ? dict.data as Record<string, unknown> : record;\n const output: Record<string, unknown> = {};\n const type = messageType(record, dict?.type ?? data.type);\n if (type !== undefined) output.type = type;\n for (const key of [\"content\", \"id\", \"name\", \"tool_call_id\", \"status\", \"artifact\", \"tool_calls\", \"invalid_tool_calls\",\n \"tool_call_chunks\", \"additional_kwargs\", \"response_metadata\", \"usage_metadata\", \"example\", \"chunk_position\"]) {\n if (data[key] !== undefined) output[key] = serializeForWire(data[key]);\n }\n return output;\n}\n\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value) as object | null;\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Convert an arbitrary graph payload into the JSON shape SDK clients expect. */\nexport function serializeForWire(value: unknown, seen = new WeakSet<object>()): unknown {\n if (value === null || value === undefined) return null;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") return value;\n if (type === \"bigint\") return Number(value as bigint);\n if (type === \"function\" || type === \"symbol\") return undefined;\n const object = value as object;\n if (seen.has(object)) return null;\n seen.add(object);\n try {\n if (object instanceof Date) return object.toISOString();\n if (object instanceof Error) return { type: object.constructor.name, message: object.message };\n if (object instanceof Uint8Array) return Buffer.from(object).toString(\"base64\");\n if (Array.isArray(object)) return object.map((entry) => serializeForWire(entry, seen));\n if (object instanceof Set) return [...object].map((entry) => serializeForWire(entry, seen));\n if (object instanceof Map) {\n const mapped: Record<string, unknown> = {};\n for (const [key, entry] of object) mapped[String(serializeForWire(key, seen))] = serializeForWire(entry, seen);\n return mapped;\n }\n if (isMessage(object)) return serializeMessage(object as Record<string, unknown>);\n if (!isPlainObject(object)) {\n const withToJson = object as { toJSON?: () => unknown };\n if (typeof withToJson.toJSON === \"function\") return serializeForWire(withToJson.toJSON(), seen);\n }\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(object as Record<string, unknown>)) {\n const serialized = serializeForWire(entry, seen);\n if (serialized !== undefined) output[key] = serialized;\n }\n return output;\n } finally {\n seen.delete(object);\n }\n}\n",
26
+ "/**\n * Legacy (v1) run stream producer.\n *\n * Mirrors the FastAPI `stream_graph_events` producer: it drives\n * `graph.stream()` (or `streamEvents` for the raw `events` mode) and maps\n * engine chunks onto the seven documented stream modes. The v2 producer in\n * `protocol-stream.ts` is separate; `run.start` runs use that one.\n */\nimport { serializeForWire } from \"./serialization.ts\";\n\nexport const SUPPORTED_STREAM_MODES = [\"values\", \"updates\", \"messages\", \"messages-tuple\", \"custom\", \"debug\", \"events\",\n \"tasks\", \"checkpoints\"] as const;\n\nexport const DEFAULT_STREAM_MODES = [\"values\"];\n\nexport interface RunStreamEvent {\n event: string;\n data: unknown;\n}\n\nexport interface RunStreamOptions {\n graph: {\n stream(input: unknown, options?: Record<string, unknown>): Promise<AsyncIterable<unknown>>;\n streamEvents?(input: unknown, options?: Record<string, unknown>): AsyncIterable<unknown>;\n };\n input: unknown;\n config: Record<string, unknown>;\n runId: string;\n streamMode: string[];\n subgraphs: boolean;\n attempt?: number;\n}\n\ntype EngineChunk = { namespace: string[]; mode: string; payload: unknown };\n\n/** Normalize a raw `graph.stream()` chunk into `(namespace, mode, payload)`. */\nfunction parseChunk(chunk: unknown, subgraphs: boolean): EngineChunk {\n if (Array.isArray(chunk) && chunk.length === 3 && typeof chunk[1] === \"string\") {\n const namespace = Array.isArray(chunk[0]) ? chunk[0].map(String) : [];\n return subgraphs ? { namespace, mode: chunk[1], payload: chunk[2] }\n : { namespace: [], mode: chunk[1], payload: chunk[2] };\n }\n if (Array.isArray(chunk) && chunk.length === 2 && typeof chunk[0] === \"string\") {\n return { namespace: [], mode: chunk[0], payload: chunk[1] };\n }\n return { namespace: [], mode: \"values\", payload: chunk };\n}\n\nfunction namespaceSuffix(event: string, namespace: string[], subgraphs: boolean): string {\n return subgraphs && namespace.length ? `${event}|${namespace.join(\"|\")}` : event;\n}\n\nfunction hasInterrupt(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) return false;\n const interrupts = (payload as Record<string, unknown>).__interrupt__;\n return Array.isArray(interrupts) && interrupts.length > 0;\n}\n\nfunction messageId(message: unknown): string {\n if (!message || typeof message !== \"object\") return MISSING_MESSAGE_ID;\n const id = (message as Record<string, unknown>).id;\n // Python keyed accumulation on `msg.id`, which is None for id-less chunks;\n // json.dumps renders that key as \"null\", so keep the same sentinel.\n return typeof id === \"string\" && id ? id : MISSING_MESSAGE_ID;\n}\n\nconst MISSING_MESSAGE_ID = \"null\";\n\nfunction isChunk(message: unknown): boolean {\n const name = (message as { constructor?: { name?: string } } | null)?.constructor?.name;\n return typeof name === \"string\" && name.endsWith(\"Chunk\");\n}\n\nfunction concatChunk(accumulated: unknown, chunk: unknown): unknown {\n const target = accumulated as { concat?: (other: unknown) => unknown };\n if (typeof target?.concat === \"function\") return target.concat(chunk);\n return chunk;\n}\n\nexport async function* streamRunEvents(options: RunStreamOptions): AsyncGenerator<RunStreamEvent> {\n const { graph, config, subgraphs } = options;\n const unsupported = options.streamMode.filter((mode) => !(SUPPORTED_STREAM_MODES as readonly string[]).includes(mode));\n // LangGraph JS ignores unknown modes; the FastAPI producer failed the run instead.\n if (unsupported.length) throw new Error(`Invalid stream mode: ${unsupported.join(\", \")}`);\n const requested = new Set(options.streamMode);\n const engineModes = new Set(requested);\n engineModes.delete(\"events\");\n // `messages-tuple` is served by the engine's `messages` mode.\n if (engineModes.has(\"messages-tuple\")) engineModes.add(\"messages\");\n const updatesExplicit = requested.has(\"updates\");\n if (!updatesExplicit) engineModes.add(\"updates\");\n\n yield { event: \"metadata\", data: { run_id: options.runId, attempt: options.attempt ?? 1 } };\n\n const accumulated = new Map<string, unknown>();\n const emit = function* (chunk: EngineChunk): Generator<RunStreamEvent> {\n const { namespace, mode, payload } = chunk;\n\n if (mode === \"messages\") {\n const tuple = Array.isArray(payload) && payload.length === 2 ? payload : [payload, {}];\n const [message, metadata] = tuple as [unknown, unknown];\n if (requested.has(\"messages-tuple\")) {\n yield { event: namespaceSuffix(\"messages\", namespace, subgraphs), data: [serializeForWire(message), serializeForWire(metadata)] };\n return;\n }\n const id = messageId(message);\n const first = !accumulated.has(id);\n if (first) {\n accumulated.set(id, message);\n yield { event: namespaceSuffix(\"messages/metadata\", namespace, subgraphs), data: { [id]: { metadata: serializeForWire(metadata) } } };\n } else {\n accumulated.set(id, concatChunk(accumulated.get(id), message));\n }\n const isPartial = isChunk(message);\n const event = isPartial ? \"messages/partial\" : \"messages/complete\";\n yield { event: namespaceSuffix(event, namespace, subgraphs), data: [serializeForWire(accumulated.get(id))] };\n return;\n }\n\n if (requested.has(mode)) {\n yield { event: namespaceSuffix(mode, namespace, subgraphs), data: serializeForWire(payload) };\n return;\n }\n // Interrupts stay visible on `values` when the client never asked for updates.\n if (mode === \"updates\" && !updatesExplicit && hasInterrupt(payload)) {\n yield { event: namespaceSuffix(\"values\", namespace, subgraphs), data: serializeForWire(payload) };\n }\n };\n\n if (requested.has(\"events\")) {\n if (!graph.streamEvents) throw new Error(\"This graph does not support the 'events' stream mode\");\n const stream = await Promise.resolve(graph.streamEvents(options.input, { ...config, version: \"v2\" }));\n for await (const raw of stream) {\n const event = raw as Record<string, unknown>;\n const tags = event.tags;\n if (Array.isArray(tags) && tags.includes(\"langsmith:hidden\")) continue;\n yield { event: \"events\", data: serializeForWire(event) };\n if (event.event !== \"on_chain_stream\") continue;\n const parents = event.parent_ids;\n if (Array.isArray(parents) && parents.length > 0) continue;\n const chunk = (event.data as Record<string, unknown> | undefined)?.chunk;\n if (chunk === undefined) continue;\n yield* emit(parseChunk(chunk, subgraphs));\n }\n return;\n }\n\n const stream = await Promise.resolve(graph.stream(options.input, {\n ...config, streamMode: [...engineModes], subgraphs,\n }));\n for await (const chunk of stream) yield* emit(parseChunk(chunk, subgraphs));\n}\n\n/** Detect interrupts in a raw legacy stream payload (drives the run's final status). */\nexport function payloadHasInterrupt(payload: unknown): boolean {\n if (hasInterrupt(payload)) return true;\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) return false;\n return Object.values(payload as Record<string, unknown>).some((value) => hasInterrupt(value));\n}\n",
27
+ "import type { Context } from \"hono\";\nimport { and, asc, eq, gt } from \"drizzle-orm\";\nimport { streamSSE } from \"hono/streaming\";\nimport { z } from \"zod\";\nimport { db } from \"../core/database.ts\";\nimport { threadEvents } from \"../core/schema.ts\";\nimport { asJsonObject, asJsonValue } from \"../core/validation.ts\";\nimport type { AppVariables, JsonObject, JsonValue } from \"../types.ts\";\nimport { publish, subscribe } from \"./broker.ts\";\n\nexport const supportedProtocolChannels = new Set([\n \"values\", \"updates\", \"messages\", \"tools\", \"lifecycle\", \"input\", \"checkpoints\", \"tasks\", \"custom\",\n]);\n\nexport const eventStreamRequestSchema = z.object({\n channels: z.array(z.string()).min(1),\n namespaces: z.array(z.array(z.string())).nullable().optional(),\n depth: z.number().int().nonnegative().nullable().optional(),\n since: z.number().int().nonnegative().nullable().optional(),\n});\n\nexport type EventStreamRequest = z.infer<typeof eventStreamRequestSchema>;\n\nexport interface ProtocolEvent {\n type: \"event\";\n seq: number;\n event_id: string;\n method: string;\n params: {\n namespace: string[];\n timestamp: number;\n node?: string;\n data: JsonValue;\n };\n}\n\nfunction protocolChannel(method: string): string {\n return method === \"input.requested\" ? \"input\" : method.startsWith(\"custom:\") ? method : method;\n}\n\nexport function isSupportedProtocolChannel(channel: string): boolean {\n return supportedProtocolChannels.has(channel) || (channel.startsWith(\"custom:\") && channel.length > 7);\n}\n\nfunction channelMatches(channels: Set<string>, event: ProtocolEvent): boolean {\n const channel = protocolChannel(event.method);\n if (channel === \"custom\") {\n if (channels.has(\"custom\")) return true;\n const data = asJsonObject(event.params.data);\n return typeof data.name === \"string\" && channels.has(`custom:${data.name}`);\n }\n if (channel.startsWith(\"custom:\")) return channels.has(\"custom\") || channels.has(channel);\n return channels.has(channel);\n}\n\nfunction namespaceMatches(request: EventStreamRequest, namespace: string[]): boolean {\n if (namespace.length === 0) return true;\n if (request.depth !== null && request.depth !== undefined && namespace.length > request.depth) return false;\n if (!request.namespaces?.length) return true;\n return request.namespaces.some((prefix) => prefix.every((segment, index) => {\n const candidate = namespace[index];\n return candidate === segment || (!segment.includes(\":\") && candidate?.split(\":\", 1)[0] === segment);\n }));\n}\n\nfunction normalizeMessage(value: unknown): unknown {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n const record = value as Record<string, unknown>;\n const kwargs = record.lc === 1 && record.kwargs && typeof record.kwargs === \"object\"\n ? record.kwargs as Record<string, unknown>\n : record;\n const id = Array.isArray(record.id) ? record.id.at(-1) : undefined;\n const constructorType = typeof id === \"string\" ? id.replace(/Message(?:Chunk)?$/, \"\").toLowerCase() : undefined;\n const rawType = typeof kwargs.type === \"string\" ? kwargs.type : constructorType;\n const type = rawType === \"assistant\" ? \"ai\" : rawType === \"user\" ? \"human\" : rawType;\n if (!type || !(\"content\" in kwargs)) return value;\n const message: Record<string, unknown> = { type, content: kwargs.content };\n for (const key of [\"id\", \"name\", \"tool_call_id\", \"status\", \"artifact\", \"tool_calls\", \"invalid_tool_calls\"]) {\n if (kwargs[key] !== undefined) message[key] = kwargs[key];\n }\n return message;\n}\n\nexport function normalizeStatePayload(value: unknown, key?: string): JsonValue {\n if (Array.isArray(value)) return value.map((entry) => key === \"messages\" ? asJsonValue(normalizeMessage(entry)) : normalizeStatePayload(entry));\n if (!value || typeof value !== \"object\") return asJsonValue(value);\n const output: JsonObject = {};\n for (const [entryKey, entryValue] of Object.entries(value as Record<string, unknown>)) {\n if (entryKey === \"__interrupt__\") continue;\n output[entryKey] = normalizeStatePayload(entryValue, entryKey);\n }\n return output;\n}\n\nfunction interruptsFrom(value: unknown): Array<{ id: string; value: JsonValue }> {\n if (!value || typeof value !== \"object\") return [];\n const raw = (value as Record<string, unknown>).__interrupt__;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") return [];\n const item = entry as Record<string, unknown>;\n return typeof item.id === \"string\" ? [{ id: item.id, value: asJsonValue(item.value) }] : [];\n });\n}\n\nexport async function publishProtocolEvent(\n threadId: string,\n runId: string,\n userId: string,\n source: { method: string; params: { namespace?: string[]; timestamp?: number; node?: string; data: unknown } },\n): Promise<ProtocolEvent[]> {\n const namespace = source.params.namespace ?? [];\n const interrupts = interruptsFrom(source.params.data);\n const projected: Array<{ method: string; data: JsonValue; namespace: string[]; node?: string }> = [];\n for (const interrupt of interrupts) {\n projected.push({\n method: \"input.requested\",\n namespace,\n data: { interrupt_id: interrupt.id, value: interrupt.value, payload: interrupt.value },\n });\n }\n const cleaned = normalizeStatePayload(source.params.data);\n if (!(source.method === \"values\" && Object.keys(asJsonObject(cleaned)).length === 0)) {\n projected.push({\n method: source.method,\n namespace,\n data: cleaned,\n ...(source.params.node ? { node: source.params.node } : {}),\n });\n }\n\n const events: ProtocolEvent[] = [];\n for (const item of projected) {\n const eventId = crypto.randomUUID();\n const rows = await db.insert(threadEvents).values({ thread_id: threadId, run_id: runId, user_id: userId,\n event_id: eventId, method: item.method, namespace: item.namespace, event_data: item.data,\n event_timestamp: source.params.timestamp ?? Date.now() }).returning({ seq: threadEvents.seq });\n const seq = Number(rows[0]?.seq);\n const event: ProtocolEvent = {\n type: \"event\", seq, event_id: eventId, method: item.method,\n params: {\n namespace: item.namespace,\n timestamp: source.params.timestamp ?? Date.now(),\n ...(item.node ? { node: item.node } : {}),\n data: item.data,\n },\n };\n events.push(event);\n await publish(`aegra:thread:${threadId}`, { event: item.method, id: String(seq), data: asJsonValue(event) });\n }\n return events;\n}\n\nfunction eventFromRow(row: Record<string, unknown>): ProtocolEvent {\n return {\n type: \"event\",\n seq: Number(row.seq),\n event_id: String(row.event_id),\n method: String(row.method),\n params: {\n namespace: Array.isArray(row.namespace) ? row.namespace.map(String) : [],\n timestamp: Number(row.event_timestamp),\n data: asJsonValue(row.event_data),\n },\n };\n}\n\nexport function protocolSseResponse(\n context: Context<{ Variables: AppVariables }>,\n threadId: string,\n userId: string,\n request: EventStreamRequest,\n): Response {\n const channels = new Set(request.channels);\n context.header(\"Cache-Control\", \"no-cache\");\n context.header(\"Connection\", \"keep-alive\");\n context.header(\"X-Accel-Buffering\", \"no\");\n return streamSSE(context, async (stream) => {\n const reader = (await subscribe(`aegra:thread:${threadId}`)).getReader();\n const seen = new Set<string>();\n stream.onAbort(() => void reader.cancel());\n const rows = await db.select({ seq: threadEvents.seq, event_id: threadEvents.event_id, method: threadEvents.method,\n namespace: threadEvents.namespace, event_data: threadEvents.event_data, event_timestamp: threadEvents.event_timestamp })\n .from(threadEvents).where(and(eq(threadEvents.thread_id, threadId), eq(threadEvents.user_id, userId),\n gt(threadEvents.seq, request.since ?? 0))).orderBy(asc(threadEvents.seq));\n for (const row of rows) {\n const event = eventFromRow(row);\n seen.add(event.event_id);\n if (channelMatches(channels, event) && namespaceMatches(request, event.params.namespace)) {\n await stream.writeSSE({ event: event.method, id: String(event.seq), data: JSON.stringify(event) });\n }\n }\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n const text = new TextDecoder().decode(value);\n const dataLine = text.split(\"\\n\").find((line) => line.startsWith(\"data: \"));\n if (!dataLine) {\n await stream.write(value);\n continue;\n }\n const event = JSON.parse(dataLine.slice(6)) as ProtocolEvent;\n if (seen.has(event.event_id)) continue;\n seen.add(event.event_id);\n if (event.seq <= (request.since ?? 0)) continue;\n if (channelMatches(channels, event) && namespaceMatches(request, event.params.namespace)) {\n await stream.writeSSE({ event: event.method, id: String(event.seq), data: JSON.stringify(event) });\n }\n }\n });\n}\n",
28
+ "import type { Context } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport { settings } from \"../config/settings.ts\";\nimport type { AppVariables, EventEnvelope } from \"../types.ts\";\nimport { getReplay, subscribe } from \"./broker.ts\";\n\ntype SseStream = Parameters<Parameters<typeof streamSSE>[1]>[0];\n\n/** `event`, `data`, `id` order and `: heartbeat` pings match the FastAPI writer. */\nfunction frame(event: EventEnvelope): string {\n const lines = [`event: ${event.event}`, `data: ${JSON.stringify(event.data)}`];\n if (event.id) lines.push(`id: ${event.id}`);\n return `${lines.join(\"\\n\")}\\n\\n`;\n}\n\nexport function sseResponse(\n context: Context<{ Variables: AppVariables }>,\n channel: string,\n onAbort?: () => void | Promise<void>,\n terminalEvent?: EventEnvelope,\n): Response {\n const lastEventId = context.req.header(\"last-event-id\");\n context.header(\"Cache-Control\", \"no-cache\");\n context.header(\"Connection\", \"keep-alive\");\n context.header(\"X-Accel-Buffering\", \"no\");\n return streamSSE(context, async (stream) => {\n const reader = (await subscribe(channel)).getReader();\n const encoder = new TextEncoder();\n const seen = new Set<string>();\n let terminal = false;\n const write = async (event: EventEnvelope): Promise<void> => {\n if (event.id) seen.add(event.id);\n // `error` is followed by `end`, so only `end` closes the connection.\n terminal ||= event.event === \"end\";\n await stream.write(encoder.encode(frame(event)));\n };\n for (const event of await getReplay(channel, lastEventId)) await write(event);\n if (terminal) {\n await reader.cancel();\n return;\n }\n if (terminalEvent) {\n await write(terminalEvent);\n await reader.cancel();\n return;\n }\n stream.onAbort(() => {\n void reader.cancel();\n void onAbort?.();\n });\n const ping = setInterval(() => void stream.write(encoder.encode(\": heartbeat\\n\\n\")),\n settings.KEEPALIVE_INTERVAL_SECS * 1000);\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n const text = new TextDecoder().decode(value);\n const id = text.split(\"\\n\").find((line) => line.startsWith(\"id: \"))?.slice(4);\n if (id && seen.has(id)) continue;\n await stream.write(value);\n const event = text.split(\"\\n\").find((line) => line.startsWith(\"event: \"))?.slice(7);\n if (event === \"end\") break;\n }\n } finally {\n clearInterval(ping);\n }\n await reader.cancel();\n });\n}\n\nexport type { SseStream };\n",
29
+ "import { Hono } from \"hono\";\nimport { settings } from \"../config/settings.ts\";\nimport openapiDocument from \"../openapi.json\";\nimport type { AppVariables } from \"../types.ts\";\n\nconst SWAGGER_UI_VERSION = \"5.17.14\";\nconst REDOC_VERSION = \"2.1.5\";\n\nconst spec = openapiDocument as Record<string, unknown> & { info: Record<string, unknown> };\n\n/** The checked-in spec is the Agent Protocol contract; only identity fields come from settings. */\nexport function openApiDocument(): Record<string, unknown> {\n return { ...spec, info: { ...spec.info, title: settings.PROJECT_NAME, version: settings.VERSION } };\n}\n\nconst swaggerHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${settings.PROJECT_NAME} - Swagger UI</title>\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@${SWAGGER_UI_VERSION}/swagger-ui.css\">\n<style>html{box-sizing:border-box;overflow-y:scroll}*,*:before,*:after{box-sizing:inherit}body{margin:0;background:#fafafa}</style>\n</head>\n<body>\n<div id=\"swagger-ui\"></div>\n<script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@${SWAGGER_UI_VERSION}/swagger-ui-bundle.js\" crossorigin></script>\n<script>\nwindow.onload = () => {\n window.ui = SwaggerUIBundle({\n url: \"/openapi.json\",\n dom_id: \"#swagger-ui\",\n layout: \"BaseLayout\",\n deepLinking: true,\n showExtensions: true,\n showCommonExtensions: true,\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n oauth2RedirectUrl: window.location.origin + \"/docs/oauth2-redirect\",\n });\n};\n</script>\n</body>\n</html>`;\n\nconst redocHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${settings.PROJECT_NAME} - ReDoc</title>\n<style>body{margin:0;padding:0}</style>\n</head>\n<body>\n<noscript>ReDoc requires JavaScript. Use <a href=\"/docs\">Swagger UI</a> or the raw <a href=\"/openapi.json\">OpenAPI document</a>.</noscript>\n<redoc spec-url=\"/openapi.json\"></redoc>\n<script src=\"https://cdn.jsdelivr.net/npm/redoc@${REDOC_VERSION}/bundles/redoc.standalone.js\"></script>\n</body>\n</html>`;\n\nconst oauth2RedirectHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"utf-8\"><title>OAuth2 Redirect</title></head>\n<body>\n<script>\n\"use strict\";\nfunction run() {\n var oauth2 = new URLSearchParams(window.location.search).get(\"state\");\n var params = new URLSearchParams();\n window.location.hash.substring(1).split(\"&\").forEach((kv) => {\n if (!kv) return;\n var split = kv.split(\"=\");\n var key = decodeURIComponent(split[0]);\n if (key === \"state\") return;\n params.append(key, decodeURIComponent(split.slice(1).join(\"=\")));\n });\n if (params.has(\"code\") || params.has(\"error\")) {\n var target = params.has(\"code\")\n ? { type: \"oauth2\", code: params.get(\"code\") }\n : { type: \"oauth2\", error: params.get(\"error\") };\n params.forEach((value, key) => { if (key !== \"code\" && key !== \"error\") target[key] = value; });\n if (window.opener) window.opener.postMessage({ type: \"oauth2-redirect\", payload: target }, window.location.origin);\n }\n void oauth2;\n}\nrun();\n</script>\n<p>OAuth2 redirect target. This page posts the authorization response back to the opener window.</p>\n</body>\n</html>`;\n\nexport const docsRoutes = new Hono<{ Variables: AppVariables }>();\n\ndocsRoutes.get(\"/openapi.json\", (context) => context.json(openApiDocument()));\ndocsRoutes.get(\"/docs\", (context) => context.html(swaggerHtml));\ndocsRoutes.get(\"/docs/oauth2-redirect\", (context) => context.html(oauth2RedirectHtml));\ndocsRoutes.get(\"/redoc\", (context) => context.html(redocHtml));\n",
30
+ "import { Hono } from \"hono\";\nimport { and, desc, eq, sql } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { settings } from \"../config/settings.ts\";\nimport { db } from \"../core/database.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { runs, threads } from \"../core/schema.ts\";\nimport { asJsonObject, getAuthorizationValue, jsonObjectSchema, parseJson } from \"../core/validation.ts\";\nimport { createAndDispatchRun, runCreateSchema, type RunCreate } from \"./runs.ts\";\nimport {\n eventStreamRequestSchema,\n isSupportedProtocolChannel,\n protocolSseResponse,\n} from \"../services/protocol-stream.ts\";\nimport type { AppVariables, JsonObject } from \"../types.ts\";\n\nconst commandSchema = z.object({ id: z.number().int(), method: z.string().min(1), params: jsonObjectSchema });\nconst interruptId = /^[0-9a-f]{32}$/;\n\nfunction success(id: number, runId: string): Record<string, unknown> {\n return { type: \"success\", id, result: { run_id: runId }, meta: { applied_through_seq: 0 } };\n}\n\nfunction failure(id: number | null, error: string, message: string): Record<string, unknown> {\n return { type: \"error\", id, error, message };\n}\n\nasync function verifyOwnedOrNew(threadId: string, userId: string, authorization: JsonObject): Promise<boolean> {\n const metadata = asJsonObject(authorization.metadata);\n const rows = await db.select({ user_id: threads.user_id,\n authorized: Object.keys(metadata).length ? sql<boolean>`${threads.metadata_json} @> ${JSON.stringify(metadata)}::jsonb` : sql<boolean>`true`,\n }).from(threads).where(eq(threads.thread_id, threadId)).limit(1);\n if (!rows[0]) return false;\n if (String(rows[0].user_id) !== userId || !rows[0].authorized) throw new ApiError(404, \"Thread not found\");\n return true;\n}\n\nfunction resumeValue(params: JsonObject): unknown {\n if (Array.isArray(params.responses)) {\n if (params.responses.length === 0) throw new ApiError(422, \"responses must be a non-empty array\");\n const result: JsonObject = {};\n for (const raw of params.responses) {\n const entry = asJsonObject(raw);\n if (typeof entry.interrupt_id !== \"string\" || !interruptId.test(entry.interrupt_id) || !(\"response\" in entry)) {\n throw new ApiError(422, \"Each response requires a valid interrupt_id and response\");\n }\n result[entry.interrupt_id] = entry.response ?? null;\n }\n return result;\n }\n if (!(\"response\" in params)) throw new ApiError(422, \"input.respond requires a response value\");\n if (params.interrupt_id === undefined) return params.response;\n if (typeof params.interrupt_id !== \"string\" || !interruptId.test(params.interrupt_id)) {\n throw new ApiError(404, \"Unknown interrupt id\", \"no_such_interrupt\");\n }\n return { [params.interrupt_id]: params.response };\n}\n\nfunction runBody(params: JsonObject): RunCreate {\n const result = runCreateSchema.safeParse({\n assistant_id: params.assistant_id,\n input: params.input,\n command: params.command,\n config: params.config ?? {},\n context: params.context ?? {},\n metadata: params.metadata,\n interrupt_before: params.interrupt_before,\n interrupt_after: params.interrupt_after,\n multitask_strategy: params.multitaskStrategy ?? params.multitask_strategy,\n });\n if (!result.success) throw new ApiError(422, result.error.issues[0]?.message ?? \"Invalid run.start params\");\n return result.data;\n}\n\nexport const eventRoutes = new Hono<{ Variables: AppVariables }>();\n\neventRoutes.post(\"/threads/:threadId/stream/events\", async (context) => {\n if (!settings.FF_V2_EVENT_STREAMING) throw new ApiError(503, \"Agent Protocol v2 event streaming is disabled\");\n const body = await parseJson(context, eventStreamRequestSchema);\n const invalid = body.channels.filter((channel) => !isSupportedProtocolChannel(channel));\n if (invalid.length) throw new ApiError(400, `Unsupported channels: ${invalid.join(\", \")}`);\n const threadId = context.req.param(\"threadId\");\n const userId = context.get(\"user\").identity;\n // The SDK mints the thread id client-side and opens the stream before run.start\n // creates the thread, so a missing thread must stay streamable; only another owner 404s.\n await verifyOwnedOrNew(threadId, userId, getAuthorizationValue(context));\n return protocolSseResponse(context, threadId, userId, body);\n});\n\neventRoutes.post(\"/threads/:threadId/commands\", async (context) => {\n if (!settings.FF_V2_EVENT_STREAMING) throw new ApiError(503, \"Agent Protocol v2 event streaming is disabled\");\n let body: z.infer<typeof commandSchema>;\n try {\n body = await parseJson(context, commandSchema);\n } catch (error) {\n if (error instanceof ApiError && error.status === 422) {\n return context.json(failure(null, \"invalid_argument\", error.message));\n }\n throw error;\n }\n const threadId = context.req.param(\"threadId\");\n const user = context.get(\"user\");\n const exists = await verifyOwnedOrNew(threadId, user.identity, getAuthorizationValue(context));\n try {\n if (body.method === \"run.start\") {\n const interrupted = exists && body.params.input !== undefined && (await db.select({ status: threads.status }).from(threads)\n .where(and(eq(threads.thread_id, threadId), eq(threads.user_id, user.identity))).limit(1))[0]?.status === \"interrupted\";\n const { input: resumeInput, ...rest } = body.params;\n const params: JsonObject = interrupted\n ? { ...rest, command: { resume: resumeInput ?? null } }\n : body.params;\n const run = runBody(params);\n run.event_streaming_v2 = true;\n const record = await createAndDispatchRun(context, threadId, run, !exists);\n return context.json(success(body.id, record.run_id));\n }\n if (body.method === \"input.respond\") {\n if (!exists) return context.json(failure(body.id, \"no_such_run\", \"No run on this thread to resume.\"));\n const latest = await db.select({ assistant_id: runs.assistant_id }).from(runs)\n .where(and(eq(runs.thread_id, threadId), eq(runs.user_id, user.identity))).orderBy(desc(runs.created_at)).limit(1);\n const assistantId = typeof body.params.assistant_id === \"string\" ? body.params.assistant_id : latest[0]?.assistant_id;\n if (!assistantId) return context.json(failure(body.id, \"no_such_run\", \"No run on this thread to resume.\"));\n const runBodyResult = runCreateSchema.safeParse({\n assistant_id: String(assistantId), command: { resume: resumeValue(body.params) },\n config: body.params.config ?? {}, metadata: body.params.metadata,\n });\n if (!runBodyResult.success) return context.json(failure(body.id, \"invalid_argument\", runBodyResult.error.issues[0]?.message ?? \"Invalid params\"));\n const resumeBody: RunCreate = { ...runBodyResult.data, event_streaming_v2: true };\n const record = await createAndDispatchRun(context, threadId, resumeBody);\n return context.json(success(body.id, record.run_id));\n }\n return context.json(failure(body.id, \"unknown_command\", `Unknown command '${body.method}'.`));\n } catch (error) {\n if (error instanceof ApiError) {\n const code = error.details === \"no_such_interrupt\" ? \"no_such_interrupt\"\n : error.status === 404 ? \"no_such_run\" : error.status === 403 ? \"permission_denied\" : \"invalid_argument\";\n return context.json(failure(body.id, code, error.message));\n }\n console.error(error);\n return context.json(failure(body.id, \"unknown_error\", `Command '${body.method}' failed unexpectedly.`));\n }\n});\n",
31
+ "import { Hono } from \"hono\";\nimport { pingDatabase } from \"../core/database.ts\";\nimport type { AppVariables } from \"../types.ts\";\nimport { settings } from \"../config/settings.ts\";\n\nexport const healthRoutes = new Hono<{ Variables: AppVariables }>();\n\nhealthRoutes.get(\"/info\", (context) =>\n context.json({\n name: \"Aegra\",\n version: settings.VERSION,\n description: \"基于 LangGraph 的生产可用 Agent Protocol 服务端\",\n status: \"running\",\n flags: { assistants: true, crons: settings.CRON_ENABLED },\n }),\n);\n\nhealthRoutes.get(\"/health\", async (context) => {\n const healthy = await pingDatabase();\n return context.json({ status: healthy ? \"healthy\" : \"unhealthy\", database: healthy ? \"connected\" : \"error\",\n langgraph_checkpointer: healthy ? \"connected\" : \"error\", langgraph_store: healthy ? \"connected\" : \"error\" }, healthy ? 200 : 503);\n});\n\nhealthRoutes.get(\"/ready\", async (context) => {\n const ready = await pingDatabase();\n return context.json({ status: ready ? \"ready\" : \"not_ready\" }, ready ? 200 : 503);\n});\n\nhealthRoutes.get(\"/live\", (context) => context.json({ status: \"alive\" }));\n",
32
+ "import { Hono, type Context } from \"hono\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { and, asc, desc, eq, inArray, sql, type SQL } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { db } from \"../core/database.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { assistants, runs, threads, threadTtl } from \"../core/schema.ts\";\nimport { asJsonObject, asJsonValue, authorizedMetadata, clampLimit, getAuthorizationValue, initialThreadMetadata, jsonObjectSchema, parseJson } from \"../core/validation.ts\";\nimport { deleteThreadCheckpoints, getGraph } from \"../services/graph-registry.ts\";\nimport { pruneExpiredThreads, resolveThreadTtl } from \"../services/thread-ttl.ts\";\nimport { cancelActiveRun } from \"./runs.ts\";\nimport type { AppVariables, JsonObject, ThreadRecord } from \"../types.ts\";\n\nconst createSchema = z.object({\n metadata: jsonObjectSchema.nullable().default({}),\n initial_state: jsonObjectSchema.nullable().optional(),\n thread_id: z.string().min(1).optional(),\n threadId: z.string().min(1).optional(),\n if_exists: z.enum([\"raise\", \"do_nothing\"]).optional(),\n ifExists: z.enum([\"raise\", \"do_nothing\"]).optional(),\n ttl: z.object({ ttl: z.number().positive().optional(), default_ttl: z.number().positive().optional(), strategy: z.enum([\"delete\", \"keep_latest\"]).optional() }).nullable().optional(),\n});\nconst updateSchema = z.object({ metadata: jsonObjectSchema.nullable() });\nconst searchSchema = z.object({\n metadata: jsonObjectSchema.nullable().default({}),\n status: z.enum([\"idle\", \"busy\", \"interrupted\", \"error\"]).nullable().optional(),\n limit: z.number().int().positive().nullable().default(20),\n offset: z.number().int().nonnegative().nullable().default(0),\n sort_by: z.enum([\"thread_id\", \"status\", \"created_at\", \"updated_at\"]).nullable().optional(),\n sort_order: z.enum([\"asc\", \"desc\"]).nullable().optional(),\n order_by: z.string().nullable().optional(),\n});\nconst stateUpdateSchema = z.object({\n values: z.union([jsonObjectSchema, z.array(jsonObjectSchema)]).nullable().optional(),\n checkpoint: jsonObjectSchema.nullable().optional(),\n checkpoint_id: z.string().nullable().optional(),\n as_node: z.string().nullable().optional(),\n checkpoint_ns: z.string().nullable().optional(),\n subgraphs: z.boolean().nullable().optional(),\n assistant_id: z.string().optional(),\n});\n\nfunction thread(row: Record<string, unknown>): ThreadRecord {\n return {\n thread_id: String(row.thread_id),\n status: String(row.status) as ThreadRecord[\"status\"],\n metadata: asJsonObject(row.metadata_json ?? row.metadata),\n user_id: String(row.user_id),\n created_at: new Date(String(row.created_at)).toISOString(),\n updated_at: new Date(String(row.updated_at)).toISOString(),\n };\n}\n\nexport function graphConfig(threadId: string, checkpoint?: JsonObject | null): RunnableConfig {\n return { configurable: { ...(checkpoint ?? {}), thread_id: threadId,\n checkpoint_ns: typeof checkpoint?.checkpoint_ns === \"string\" ? checkpoint.checkpoint_ns : \"\" } };\n}\n\nfunction authorizationFilters(context: Context<{ Variables: AppVariables }>): SQL[] {\n const value = getAuthorizationValue(context);\n const metadata = asJsonObject(value.metadata);\n return [\n typeof value.thread_id === \"string\" ? eq(threads.thread_id, value.thread_id) : undefined,\n typeof value.status === \"string\" ? eq(threads.status, value.status) : undefined,\n Object.keys(metadata).length ? sql`${threads.metadata_json} @> ${JSON.stringify(metadata)}::jsonb` : undefined,\n ].filter((filter): filter is SQL => filter !== undefined);\n}\n\nasync function ownedThread(threadId: string, context: Context<{ Variables: AppVariables }>): Promise<ThreadRecord> {\n const rows = await db.select().from(threads).where(and(eq(threads.thread_id, threadId),\n eq(threads.user_id, context.get(\"user\").identity), ...authorizationFilters(context))).limit(1);\n if (!rows[0]) throw new ApiError(404, \"Thread not found\");\n return thread(rows[0]);\n}\n\nasync function graphForThread(threadId: string, context: Context<{ Variables: AppVariables }>) {\n const user = context.get(\"user\");\n const userId = user.identity;\n const owned = await ownedThread(threadId, context);\n const graphId = typeof owned.metadata.graph_id === \"string\" ? owned.metadata.graph_id : undefined;\n if (graphId) return getGraph(graphId, { user, accessContext: \"threads.read\", config: graphConfig(threadId) });\n const rows = await db.select({ graph_id: assistants.graph_id }).from(assistants).innerJoin(runs, eq(runs.assistant_id, assistants.assistant_id))\n .where(and(eq(runs.thread_id, threadId), eq(runs.user_id, userId))).orderBy(desc(runs.created_at)).limit(1);\n if (!rows[0]) return undefined;\n return getGraph(String(rows[0].graph_id), { user, accessContext: \"threads.read\", config: graphConfig(threadId) });\n}\n\nfunction emptyState(threadId: string): Record<string, unknown> {\n const checkpoint = { checkpoint_id: null, thread_id: threadId, checkpoint_ns: \"\" };\n return { values: {}, next: [], tasks: [], interrupts: [], metadata: {}, created_at: null,\n checkpoint, parent_checkpoint: null, checkpoint_id: null, parent_checkpoint_id: null };\n}\n\nfunction serializeState(state: unknown): unknown {\n if (!state || typeof state !== \"object\") return state;\n const value = state as Record<string, unknown>;\n const config = asJsonObject(value.config);\n const parent = value.parentConfig ? asJsonObject(value.parentConfig) : null;\n return {\n values: asJsonObject(value.values), next: Array.isArray(value.next) ? value.next : [],\n tasks: Array.isArray(value.tasks) ? asJsonValue(value.tasks) : [],\n interrupts: Array.isArray(value.tasks) ? value.tasks.flatMap((task) => {\n const interrupts = asJsonObject(task).interrupts;\n return Array.isArray(interrupts) ? interrupts.map(asJsonObject) : [];\n }) : [], metadata: asJsonObject(value.metadata),\n created_at: value.createdAt ?? null, checkpoint: asJsonObject(config.configurable),\n parent_checkpoint: parent ? asJsonObject(parent.configurable) : null,\n checkpoint_id: asJsonObject(config.configurable).checkpoint_id ?? null,\n parent_checkpoint_id: parent ? asJsonObject(parent.configurable).checkpoint_id ?? null : null,\n };\n}\n\nexport const threadRoutes = new Hono<{ Variables: AppVariables }>();\n\nthreadRoutes.post(\"/threads\", async (context) => {\n const body = await parseJson(context, createSchema);\n const id = body.thread_id ?? body.threadId ?? crypto.randomUUID();\n const ifExists = body.if_exists ?? body.ifExists ?? \"raise\";\n const userId = context.get(\"user\").identity;\n const ttl = await resolveThreadTtl(body.ttl);\n // Handlers may inject tenant metadata (e.g. team_id); it wins over the body.\n const metadata = { ...(body.metadata ?? {}), ...authorizedMetadata(context) };\n const created = await db.transaction(async (transaction) => {\n const rows = await transaction.insert(threads).values({ thread_id: id,\n metadata_json: initialThreadMetadata(userId, metadata), user_id: userId })\n .onConflictDoNothing().returning();\n if (rows[0] && ttl) await transaction.insert(threadTtl).values({ thread_id: id, strategy: ttl.strategy,\n ttl_minutes: ttl.ttlMinutes, expires_at: new Date(Date.now() + ttl.ttlMinutes * 60_000) });\n return rows;\n });\n if (created[0]) return context.json(thread(created[0]));\n const existing = await db.select().from(threads).where(and(eq(threads.thread_id, id), eq(threads.user_id, userId))).limit(1);\n if (existing[0] && ifExists === \"do_nothing\") return context.json(thread(existing[0]));\n throw new ApiError(409, \"Thread already exists\");\n});\n\nthreadRoutes.get(\"/threads\", async (context) => {\n const userId = context.get(\"user\").identity;\n const filters = authorizationFilters(context);\n const rows = await db.select().from(threads).where(and(eq(threads.user_id, userId), ...filters)).orderBy(desc(threads.created_at));\n return context.json({ threads: rows.map((row) => thread(row)), total: rows.length });\n});\n\nthreadRoutes.post(\"/threads/search\", async (context) => {\n const body = await parseJson(context, searchSchema);\n const userId = context.get(\"user\").identity;\n const legacy = body.order_by?.match(/^(thread_id|status|created_at|updated_at)(?:\\s+(asc|desc))?$/i);\n if (body.order_by && !legacy) throw new ApiError(422, \"Invalid order_by\");\n const fieldName = (body.sort_by ?? legacy?.[1]?.toLowerCase() ?? \"created_at\") as \"thread_id\" | \"status\" | \"created_at\" | \"updated_at\";\n const field = threads[fieldName];\n const rows = await db.select().from(threads).where(and(eq(threads.user_id, userId),\n body.status ? eq(threads.status, body.status) : undefined, sql`${threads.metadata_json} @> ${JSON.stringify(body.metadata ?? {})}::jsonb`))\n .orderBy((body.sort_order ?? legacy?.[2]?.toLowerCase()) === \"asc\" ? asc(field) : desc(field))\n .limit(clampLimit(body.limit, 20, settings.MAX_SEARCH_LIMIT)).offset(body.offset ?? 0);\n return context.json(rows.map((row) => thread(row)));\n});\n\nthreadRoutes.get(\"/threads/:threadId\", async (context) =>\n context.json(await ownedThread(context.req.param(\"threadId\"), context)),\n);\n\nthreadRoutes.patch(\"/threads/:threadId\", async (context) => {\n const body = await parseJson(context, updateSchema);\n const id = context.req.param(\"threadId\");\n const userId = context.get(\"user\").identity;\n const patch = { ...(body.metadata ?? {}), ...authorizedMetadata(context) };\n const rows = await db.update(threads).set({ metadata_json: sql`${threads.metadata_json} || ${JSON.stringify(patch)}::jsonb`, updated_at: new Date() })\n .where(and(eq(threads.thread_id, id), eq(threads.user_id, userId), ...authorizationFilters(context))).returning();\n if (!rows[0]) throw new ApiError(404, \"Thread not found\");\n return context.json(thread(rows[0]));\n});\n\nthreadRoutes.delete(\"/threads/:threadId\", async (context) => {\n const threadId = context.req.param(\"threadId\");\n await ownedThread(threadId, context);\n // Cancel in-flight runs first: their worker would otherwise keep writing to a\n // thread that no longer exists once the cascade removes the run row.\n for (const row of await db.select({ run_id: runs.run_id }).from(runs)\n .where(and(eq(runs.thread_id, threadId), inArray(runs.status, [\"pending\", \"running\"])))) {\n await cancelActiveRun(String(row.run_id));\n }\n await deleteThreadCheckpoints(threadId);\n const rows = await db.delete(threads).where(and(eq(threads.thread_id, threadId),\n eq(threads.user_id, context.get(\"user\").identity), ...authorizationFilters(context))).returning({ thread_id: threads.thread_id });\n if (!rows[0]) throw new ApiError(404, \"Thread not found\");\n return context.json({ status: \"deleted\" });\n});\n\nthreadRoutes.post(\"/threads/prune\", async (context) => context.json(await pruneExpiredThreads(context.get(\"user\").identity)));\n\nthreadRoutes.get(\"/threads/:threadId/state\", async (context) => {\n const id = context.req.param(\"threadId\");\n const graph = await graphForThread(id, context);\n if (!graph) return context.json(emptyState(id));\n if (!graph.getState) throw new ApiError(404, \"Thread state is unavailable\");\n const checkpoint_ns = context.req.query(\"checkpoint_ns\");\n const state = await graph.getState(graphConfig(id, checkpoint_ns ? { checkpoint_ns } : undefined),\n { subgraphs: context.req.query(\"subgraphs\") === \"true\" });\n if (!state) throw new ApiError(404, \"No state found\");\n return context.json(serializeState(state));\n});\n\nthreadRoutes.get(\"/threads/:threadId/state/:checkpointId\", async (context) => {\n const id = context.req.param(\"threadId\");\n const graph = await graphForThread(id, context);\n if (!graph?.getState) throw new ApiError(404, \"Thread state is unavailable\");\n const checkpoint_ns = context.req.query(\"checkpoint_ns\");\n const state = await graph.getState(graphConfig(id, { checkpoint_id: context.req.param(\"checkpointId\"),\n ...(checkpoint_ns ? { checkpoint_ns } : {}) }), { subgraphs: context.req.query(\"subgraphs\") === \"true\" });\n if (!state) throw new ApiError(404, \"No state found\");\n return context.json(serializeState(state));\n});\n\nthreadRoutes.post(\"/threads/:threadId/state/checkpoint\", async (context) => {\n const body = await parseJson(context, z.object({ checkpoint: jsonObjectSchema, subgraphs: z.boolean().nullable().optional() }));\n const id = context.req.param(\"threadId\");\n const graph = await graphForThread(id, context);\n if (!graph?.getState) throw new ApiError(404, \"Thread state is unavailable\");\n const checkpointId = body.checkpoint.checkpoint_id;\n if (typeof checkpointId !== \"string\" || !checkpointId) throw new ApiError(400, \"checkpoint_id is required\");\n const state = await graph.getState(graphConfig(id, body.checkpoint), { subgraphs: body.subgraphs ?? false });\n if (!state) throw new ApiError(404, \"No state found\");\n return context.json(serializeState(state));\n});\n\nthreadRoutes.post(\"/threads/:threadId/state\", async (context) => {\n const body = await parseJson(context, stateUpdateSchema);\n const id = context.req.param(\"threadId\");\n const graph = await graphForThread(id, context);\n if (body.values == null && !body.as_node && !body.checkpoint_id && !body.checkpoint) {\n if (!graph) return context.json(emptyState(id));\n if (!graph.getState) throw new ApiError(404, \"Thread state is unavailable\");\n const state = await graph.getState(graphConfig(id, body.checkpoint_ns ? { checkpoint_ns: body.checkpoint_ns } : undefined),\n { subgraphs: body.subgraphs ?? false });\n if (!state) throw new ApiError(404, \"No state found\");\n return context.json(serializeState(state));\n }\n if (!graph?.updateState) throw new ApiError(400, \"Thread has no associated graph\");\n const values = Array.isArray(body.values) ? Object.assign({}, ...body.values) : body.values ?? null;\n const checkpoint = await graph.updateState(\n graphConfig(id, { ...(body.checkpoint ?? {}), ...(body.checkpoint_id ? { checkpoint_id: body.checkpoint_id } : {}),\n ...(body.checkpoint_ns ? { checkpoint_ns: body.checkpoint_ns } : {}) }),\n values, body.as_node ?? undefined,\n );\n return context.json({ checkpoint: asJsonValue(checkpoint.configurable ?? {}) });\n});\n\nasync function historyResponse(context: Context<{ Variables: AppVariables }>, body: {\n limit?: number | null | undefined; before?: JsonObject | string | null | undefined; metadata?: JsonObject | null | undefined;\n checkpoint?: JsonObject | null | undefined; checkpoint_ns?: string | null | undefined; subgraphs?: boolean | null | undefined;\n}): Promise<Response> {\n const id = context.req.param(\"threadId\") as string;\n const graph = await graphForThread(id, context);\n if (!graph) return context.json([]);\n if (!graph.getStateHistory) throw new ApiError(404, \"Thread history is unavailable\");\n const result: unknown[] = [];\n const before = typeof body.before === \"string\" ? graphConfig(id, { checkpoint_id: body.before })\n : body.before && \"configurable\" in body.before ? body.before as RunnableConfig\n : body.before ? graphConfig(id, body.before) : undefined;\n const config = graphConfig(id, { ...(body.checkpoint ?? {}), ...(body.checkpoint_ns ? { checkpoint_ns: body.checkpoint_ns } : {}) });\n for await (const state of graph.getStateHistory(config, {\n limit: body.limit ?? 10, before, filter: body.metadata ?? undefined, subgraphs: body.subgraphs ?? false,\n })) result.push(serializeState(state));\n return context.json(result);\n}\n\nthreadRoutes.post(\"/threads/:threadId/history\", async (context) => {\n const body = await parseJson(context, z.object({\n limit: z.number().int().positive().max(1000).nullable().default(10),\n before: z.union([jsonObjectSchema, z.string()]).nullable().optional(), metadata: jsonObjectSchema.nullable().optional(),\n checkpoint: jsonObjectSchema.nullable().optional(), checkpoint_ns: z.string().nullable().optional(),\n subgraphs: z.boolean().nullable().optional(),\n }));\n return historyResponse(context, body);\n});\nthreadRoutes.get(\"/threads/:threadId/history\", (context) => {\n let metadata: JsonObject | undefined;\n const rawMetadata = context.req.query(\"metadata\");\n if (rawMetadata) {\n try {\n const parsed = JSON.parse(rawMetadata) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"metadata must be an object\");\n metadata = parsed as JsonObject;\n } catch (error) {\n throw new ApiError(422, `Invalid metadata query parameter: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n return historyResponse(context, {\n limit: clampLimit(context.req.query(\"limit\"), 10), before: context.req.query(\"before\"),\n checkpoint_ns: context.req.query(\"checkpoint_ns\"), subgraphs: context.req.query(\"subgraphs\") === \"true\",\n ...(metadata ? { metadata } : {}),\n });\n});\n",
33
+ "import { z } from \"zod\";\nimport { and, asc, eq, inArray, lte, notExists, sql } from \"drizzle-orm\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport { db } from \"../core/database.ts\";\nimport { ApiError } from \"../core/errors.ts\";\nimport { runs, threads, threadTtl } from \"../core/schema.ts\";\nimport { deleteThreadCheckpoints } from \"./graph-registry.ts\";\n\nconst ttlSchema = z.object({\n strategy: z.enum([\"delete\", \"keep_latest\"]).default(\"delete\"),\n default_ttl: z.number().positive().max(1_000_000_000).default(43_200),\n sweep_interval_minutes: z.number().positive().max(1_000_000_000).default(5),\n sweep_limit: z.number().int().positive().default(100),\n});\n\nexport type ThreadTtlConfig = z.infer<typeof ttlSchema>;\ntype ThreadTtlRequest = {\n ttl?: number | undefined;\n default_ttl?: number | undefined;\n strategy?: \"delete\" | \"keep_latest\" | undefined;\n} | null | undefined;\n\nexport function parseThreadTtl(raw: string | Record<string, unknown>): ThreadTtlConfig {\n if (typeof raw !== \"string\") return ttlSchema.parse(raw);\n const numeric = Number(raw);\n return ttlSchema.parse(Number.isFinite(numeric) ? { default_ttl: numeric } : JSON.parse(raw));\n}\n\nexport async function threadTtlConfig(): Promise<ThreadTtlConfig | undefined> {\n const raw = settings.AEGRA_THREAD_TTL ?? settings.LANGGRAPH_THREAD_TTL;\n if (raw?.trim()) return parseThreadTtl(raw);\n const configured = (await loadConfig()).checkpointer?.ttl;\n return configured ? ttlSchema.parse(configured) : undefined;\n}\n\nexport async function resolveThreadTtl(request: ThreadTtlRequest): Promise<{ strategy: string; ttlMinutes: number } | undefined> {\n const configured = await threadTtlConfig();\n if (!request && !configured) return undefined;\n const requestedMinutes = request?.ttl ?? request?.default_ttl;\n if (!configured && requestedMinutes === undefined) {\n throw new ApiError(422, \"ttl.default_ttl is required when no server-side TTL default is configured\");\n }\n return {\n strategy: request?.strategy ?? configured?.strategy ?? \"delete\",\n ttlMinutes: requestedMinutes ?? configured?.default_ttl ?? 43_200,\n };\n}\n\nexport async function pruneExpiredThreads(userId?: string): Promise<{ deleted: number; pruned: number }> {\n const config = await threadTtlConfig() ?? ttlSchema.parse({});\n return db.transaction(async (transaction) => {\n const activeRun = transaction.select({ value: sql`1` }).from(runs).where(and(\n eq(runs.thread_id, threadTtl.thread_id), inArray(runs.status, [\"pending\", \"running\"]),\n ));\n const rows = await transaction.select({ thread_id: threadTtl.thread_id, strategy: threadTtl.strategy,\n ttl_minutes: threadTtl.ttl_minutes }).from(threadTtl).innerJoin(threads, eq(threads.thread_id, threadTtl.thread_id))\n .where(and(lte(threadTtl.expires_at, new Date()), userId ? eq(threads.user_id, userId) : undefined,\n notExists(activeRun))).orderBy(asc(threadTtl.expires_at)).limit(config.sweep_limit).for(\"update\", { skipLocked: true });\n let deleted = 0;\n let pruned = 0;\n for (const row of rows) {\n if (row.strategy === \"keep_latest\") {\n await transaction.execute(sql`DELETE FROM checkpoints c USING (\n SELECT checkpoint_ns, max(checkpoint_id) latest_id FROM checkpoints WHERE thread_id=${row.thread_id} GROUP BY checkpoint_ns\n ) keep WHERE c.thread_id=${row.thread_id} AND c.checkpoint_ns=keep.checkpoint_ns AND c.checkpoint_id<>keep.latest_id`);\n await transaction.execute(sql`DELETE FROM checkpoint_writes w WHERE w.thread_id=${row.thread_id} AND NOT EXISTS (\n SELECT 1 FROM checkpoints c WHERE c.thread_id=w.thread_id AND c.checkpoint_ns=w.checkpoint_ns\n AND c.checkpoint_id=w.checkpoint_id)`);\n await transaction.execute(sql`DELETE FROM checkpoint_blobs b WHERE b.thread_id=${row.thread_id} AND NOT EXISTS (\n SELECT 1 FROM checkpoints c, jsonb_each_text(c.checkpoint->'channel_versions') cv(channel,version)\n WHERE c.thread_id=b.thread_id AND c.checkpoint_ns=b.checkpoint_ns AND cv.channel=b.channel AND cv.version=b.version)`);\n await transaction.update(threadTtl).set({ expires_at: new Date(Date.now() + row.ttl_minutes * 60_000) })\n .where(eq(threadTtl.thread_id, row.thread_id));\n pruned += 1;\n continue;\n }\n await deleteThreadCheckpoints(row.thread_id);\n const removed = await transaction.delete(threads).where(eq(threads.thread_id, row.thread_id))\n .returning({ thread_id: threads.thread_id });\n if (removed.length) deleted += 1;\n }\n return { deleted, pruned };\n });\n}\n\nlet timer: Timer | undefined;\n\nexport async function startThreadTtlSweeper(): Promise<void> {\n const config = await threadTtlConfig();\n if (!config || timer) return;\n void pruneExpiredThreads().catch((error: unknown) => console.error(\"thread TTL sweep failed\", error));\n timer = setInterval(() => void pruneExpiredThreads().catch((error: unknown) => console.error(\"thread TTL sweep failed\", error)),\n config.sweep_interval_minutes * 60_000);\n}\n\nexport function stopThreadTtlSweeper(): void {\n if (timer) clearInterval(timer);\n timer = undefined;\n}\n",
34
+ "import type { Hono } from \"hono\";\nimport { createApp } from \"./app.ts\";\nimport { settings } from \"./config/settings.ts\";\nimport { closeDatabase, migrate } from \"./core/database.ts\";\nimport { closeRedis, connectRedis } from \"./core/redis.ts\";\nimport { startObservability, stopObservability } from \"./observability.ts\";\nimport { startCronScheduler, stopCronScheduler } from \"./services/cron-scheduler.ts\";\nimport { closeGraphs, initializeGraphs } from \"./services/graph-registry.ts\";\nimport { startThreadTtlSweeper, stopThreadTtlSweeper } from \"./services/thread-ttl.ts\";\nimport { startWorkers, stopWorkers } from \"./services/workers.ts\";\nimport type { AppVariables } from \"./types.ts\";\n\nexport interface RuntimeOptions {\n hostname?: string;\n port?: number;\n idleTimeout?: number;\n}\n\nexport interface RuntimeDependencies {\n startObservability(): void;\n createApp(): Promise<Hono<{ Variables: AppVariables }>>;\n migrate(): Promise<void>;\n connectRedis(): Promise<void>;\n initializeGraphs(): Promise<void>;\n startWorkers(): Promise<void>;\n startCronScheduler(): void;\n startThreadTtlSweeper(): Promise<void>;\n stopCronScheduler(): void;\n stopThreadTtlSweeper(): void;\n stopWorkers(): Promise<void>;\n closeGraphs(): Promise<void>;\n closeRedis(): Promise<void>;\n closeDatabase(): Promise<void>;\n stopObservability(): Promise<void>;\n}\n\nconst defaultDependencies: RuntimeDependencies = {\n startObservability, createApp, migrate, connectRedis, initializeGraphs, startWorkers, startCronScheduler, startThreadTtlSweeper,\n stopCronScheduler, stopThreadTtlSweeper, stopWorkers, closeGraphs, closeRedis, closeDatabase, stopObservability,\n};\n\nexport interface AegraRuntime {\n readonly app: Hono<{ Variables: AppVariables }> | undefined;\n readonly server: Bun.Server<undefined> | undefined;\n start(): Promise<Bun.Server<undefined>>;\n stop(): Promise<void>;\n}\n\nclass Runtime implements AegraRuntime {\n app: Hono<{ Variables: AppVariables }> | undefined;\n server: Bun.Server<undefined> | undefined;\n private state: \"idle\" | \"starting\" | \"running\" | \"stopping\" | \"stopped\" = \"idle\";\n private readonly acquired = {\n observability: false,\n database: false,\n redis: false,\n graphs: false,\n workers: false,\n cronScheduler: false,\n threadTtlSweeper: false,\n };\n\n constructor(private readonly options: RuntimeOptions, private readonly dependencies: RuntimeDependencies) {}\n\n async start(): Promise<Bun.Server<undefined>> {\n if (this.state !== \"idle\") throw new Error(`Aegra runtime cannot start from state '${this.state}'`);\n this.state = \"starting\";\n try {\n this.dependencies.startObservability();\n this.acquired.observability = true;\n this.acquired.database = true;\n if (settings.RUN_MIGRATIONS_ON_STARTUP) await this.dependencies.migrate();\n this.acquired.redis = true;\n await this.dependencies.connectRedis();\n this.acquired.graphs = true;\n await this.dependencies.initializeGraphs();\n this.acquired.workers = true;\n await this.dependencies.startWorkers();\n this.dependencies.startCronScheduler();\n this.acquired.cronScheduler = true;\n this.acquired.threadTtlSweeper = true;\n await this.dependencies.startThreadTtlSweeper();\n this.app = await this.dependencies.createApp();\n this.server = Bun.serve({\n hostname: this.options.hostname ?? settings.HOST,\n port: this.options.port ?? settings.PORT,\n fetch: this.app.fetch,\n idleTimeout: this.options.idleTimeout ?? 255,\n });\n this.state = \"running\";\n return this.server;\n } catch (error) {\n await this.closeResources();\n this.state = \"stopped\";\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (this.state === \"idle\" || this.state === \"stopped\" || this.state === \"stopping\") return;\n this.state = \"stopping\";\n this.server?.stop(false);\n this.server = undefined;\n this.app = undefined;\n await this.closeResources();\n this.state = \"stopped\";\n }\n\n private async closeResources(): Promise<void> {\n const cleanup: Array<Promise<void>> = [];\n if (this.acquired.cronScheduler) {\n this.acquired.cronScheduler = false;\n cleanup.push(Promise.resolve().then(() => this.dependencies.stopCronScheduler()));\n }\n if (this.acquired.threadTtlSweeper) {\n this.acquired.threadTtlSweeper = false;\n cleanup.push(Promise.resolve().then(() => this.dependencies.stopThreadTtlSweeper()));\n }\n if (this.acquired.workers) {\n this.acquired.workers = false;\n cleanup.push(this.dependencies.stopWorkers());\n }\n if (this.acquired.graphs) {\n this.acquired.graphs = false;\n cleanup.push(this.dependencies.closeGraphs());\n }\n if (this.acquired.redis) {\n this.acquired.redis = false;\n cleanup.push(this.dependencies.closeRedis());\n }\n if (this.acquired.database) {\n this.acquired.database = false;\n cleanup.push(this.dependencies.closeDatabase());\n }\n if (this.acquired.observability) {\n this.acquired.observability = false;\n cleanup.push(this.dependencies.stopObservability());\n }\n await Promise.allSettled(cleanup);\n }\n}\n\nexport function createRuntime(\n options: RuntimeOptions = {},\n dependencies: RuntimeDependencies = defaultDependencies,\n): AegraRuntime {\n return new Runtime(options, dependencies);\n}\n",
35
+ "import { settings } from \"../config/settings.ts\";\nimport { hostname } from \"node:os\";\nimport { and, asc, eq, like, lt, or } from \"drizzle-orm\";\nimport { db } from \"../core/database.ts\";\nimport { createRedisConnection, getRedis } from \"../core/redis.ts\";\nimport { runs } from \"../core/schema.ts\";\nimport { asJsonObject } from \"../core/validation.ts\";\nimport { cancelActiveRun, executeRun, runFromRow, setThreadStatusIfNoActiveRuns, startCancellationListener, stopCancellationListener, type RunCreate } from \"../routes/runs.ts\";\nimport type { AuthUser, RunRecord } from \"../types.ts\";\n\nlet running = false;\nlet workerTasks: Promise<void>[] = [];\nlet reaper: Timer | undefined;\nconst instanceId = `${hostname()}-${process.pid}`;\n\nasync function workerLoop(index: number): Promise<void> {\n const redis = await createRedisConnection();\n if (!redis) return;\n try {\n while (running) {\n let runId: string | undefined;\n try { runId = (await redis.blpop(settings.WORKER_QUEUE_KEY, 1))?.[1]; }\n catch (error) {\n console.warn(\"Redis worker dequeue failed; polling PostgreSQL\", error);\n await Bun.sleep(settings.POSTGRES_POLL_INTERVAL_SECONDS * 1000);\n runId = (await db.select({ run_id: runs.run_id }).from(runs).where(eq(runs.status, \"pending\"))\n .orderBy(asc(runs.created_at)).limit(1))[0]?.run_id;\n }\n if (!runId) continue;\n try {\n const rows = await db.select().from(runs).where(and(eq(runs.run_id, runId), eq(runs.status, \"pending\"))).limit(1);\n if (!rows[0]) continue;\n const record = runFromRow(rows[0]);\n const body = asJsonObject(rows[0].execution_params) as RunCreate;\n const user: AuthUser = { identity: record.user_id, isAuthenticated: true, permissions: [] };\n console.log(JSON.stringify({ event: \"worker_dequeued\", worker: index, run_id: runId }));\n await executeRun(record, body, user, `${instanceId}-${index}`);\n } catch (error) {\n console.error(\"worker job failed\", runId, error);\n }\n }\n } finally {\n try { await redis.quit(); }\n catch (error) { console.warn(\"Redis worker shutdown failed\", error); }\n }\n}\n\nexport async function reapAbandonedRuns(): Promise<number> {\n const now = new Date();\n const stale = new Date(now.getTime() - settings.STUCK_PENDING_THRESHOLD_SECONDS * 1000);\n const recovered = await db.transaction(async (transaction) => {\n const recoverable = await transaction.select().from(runs).where(or(\n and(eq(runs.status, \"running\"), lt(runs.lease_expires_at, now)),\n and(eq(runs.status, \"pending\"), lt(runs.updated_at, stale)),\n )).for(\"update\", { skipLocked: true });\n const queued: string[] = [];\n const exhausted: Array<{ threadId: string; userId: string }> = [];\n for (const row of recoverable) {\n const params = asJsonObject(row.execution_params);\n const retries = row.status === \"running\" ? Number(params._retry_count ?? 0) + 1 : Number(params._retry_count ?? 0);\n const isExhausted = row.status === \"running\" && retries > settings.BG_JOB_MAX_RETRIES;\n await transaction.update(runs).set({ status: isExhausted ? \"error\" : \"pending\",\n error_message: isExhausted ? \"Max retries exceeded after repeated worker failures\" : null,\n execution_params: { ...params, _retry_count: retries }, claimed_by: null, lease_expires_at: null, updated_at: now })\n .where(eq(runs.run_id, row.run_id));\n if (!isExhausted) queued.push(String(row.run_id));\n else exhausted.push({ threadId: row.thread_id, userId: row.user_id });\n }\n return { queued, exhausted, count: recoverable.length };\n });\n for (const row of recovered.exhausted) await setThreadStatusIfNoActiveRuns(row.threadId, row.userId, \"error\");\n const redis = getRedis();\n if (redis && recovered.queued.length) {\n try { await redis.rpush(settings.WORKER_QUEUE_KEY, ...recovered.queued); }\n catch (error) { console.warn(\"Redis recovery enqueue failed; PostgreSQL polling will recover runs\", error); }\n }\n return recovered.count;\n}\n\nexport async function startWorkers(): Promise<void> {\n try { await startCancellationListener(); }\n catch (error) { console.warn(\"Redis cancellation listener unavailable; local cancellation retained\", error); }\n if (!settings.REDIS_BROKER_ENABLED || running) return;\n running = true;\n const count = settings.WORKER_COUNT * settings.N_JOBS_PER_WORKER;\n workerTasks = Array.from({ length: count }, (_, index) => workerLoop(index));\n reaper = setInterval(() => void reapAbandonedRuns().catch((error: unknown) => console.error(\"run reaper failed\", error)),\n settings.REAPER_INTERVAL_SECONDS * 1000);\n}\n\nexport async function stopWorkers(): Promise<void> {\n running = false;\n if (reaper) clearInterval(reaper);\n reaper = undefined;\n const drained = Promise.allSettled(workerTasks);\n await Promise.race([drained, Bun.sleep(settings.WORKER_DRAIN_TIMEOUT * 1000)]);\n const interrupted = await db.select({ run_id: runs.run_id }).from(runs)\n .where(and(eq(runs.status, \"running\"), like(runs.claimed_by, `${instanceId}-%`)));\n for (const row of interrupted) {\n await cancelActiveRun(String(row.run_id), \"shutdown\");\n }\n await drained;\n const redis = getRedis();\n if (redis && interrupted.length) {\n try { await redis.rpush(settings.WORKER_QUEUE_KEY, ...interrupted.map((row) => String(row.run_id))); }\n catch (error) { console.warn(\"Redis shutdown requeue failed; PostgreSQL polling will recover runs\", error); }\n }\n await stopCancellationListener();\n workerTasks = [];\n}\n",
36
+ "import { createRuntime } from \"./runtime.ts\";\n\nconst runtime = createRuntime();\nconst server = await runtime.start();\nconsole.log(`Aegra listening on ${server.url}`);\n\nlet shuttingDown = false;\nasync function shutdown(): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n console.log(\"Shutting down Aegra...\");\n await runtime.stop();\n}\n\nprocess.on(\"SIGINT\", () => void shutdown().then(() => process.exit(0)));\nprocess.on(\"SIGTERM\", () => void shutdown().then(() => process.exit(0)));\n"
37
+ ],
38
+ "mappings": "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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKT,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AAEtB,IAAM,OAAO;AAGN,SAAS,eAAe,GAA4B;AAAA,EACzD,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,OAAO,SAAS,cAAc,SAAS,SAAS,QAAQ,EAAE;AAAA;AAGpG,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,SAKX,SAAS;AAAA,4EAC0D;AAAA;AAAA;AAAA;AAAA;AAAA,4DAKhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5D,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,SAKT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAMgC;AAAA;AAAA;AAIlD,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BpB,IAAM,aAAa,IAAI;AAE9B,WAAW,IAAI,iBAAiB,CAAC,aAAY,SAAQ,KAAK,gBAAgB,CAAC,CAAC;AAC5E,WAAW,IAAI,SAAS,CAAC,aAAY,SAAQ,KAAK,WAAW,CAAC;AAC9D,WAAW,IAAI,yBAAyB,CAAC,aAAY,SAAQ,KAAK,kBAAkB,CAAC;AACrF,WAAW,IAAI,UAAU,CAAC,aAAY,SAAQ,KAAK,SAAS,CAAC;;;AC5F7D;AACA;AAJA,iBAAS;AACT,gBAAS,cAAK,aAAM,YAAI;AACxB,cAAS;AAIT;AAUA,IAAM,gBAAgB,GAAE,OAAO,EAAE,IAAI,GAAE,OAAO,EAAE,IAAI,GAAG,QAAQ,GAAE,OAAO,EAAE,IAAI,CAAC,GAAG,QAAQ,iBAAiB,CAAC;AAC5G,IAAM,cAAc;AAEpB,SAAS,OAAO,CAAC,IAAY,OAAwC;AAAA,EACnE,OAAO,EAAE,MAAM,WAAW,IAAI,QAAQ,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,qBAAqB,EAAE,EAAE;AAAA;AAG5F,SAAS,OAAO,CAAC,IAAmB,OAAe,SAA0C;AAAA,EAC3F,OAAO,EAAE,MAAM,SAAS,IAAI,OAAO,QAAQ;AAAA;AAG7C,eAAe,gBAAgB,CAAC,UAAkB,QAAgB,eAA6C;AAAA,EAC7G,MAAM,WAAW,aAAa,cAAc,QAAQ;AAAA,EACpD,MAAM,OAAO,MAAM,GAAG,OAAO;AAAA,IAAE,SAAS,QAAQ;AAAA,IAC9C,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,OAAe,QAAQ,oBAAoB,KAAK,UAAU,QAAQ,aAAa;AAAA,EAC5H,CAAC,EAAE,KAAK,OAAO,EAAE,MAAM,IAAG,QAAQ,WAAW,QAAQ,CAAC,EAAE,MAAM,CAAC;AAAA,EAC/D,IAAI,CAAC,KAAK;AAAA,IAAI,OAAO;AAAA,EACrB,IAAI,OAAO,KAAK,GAAG,OAAO,MAAM,UAAU,CAAC,KAAK,GAAG;AAAA,IAAY,MAAM,IAAI,SAAS,KAAK,kBAAkB;AAAA,EACzG,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,QAA6B;AAAA,EAChD,IAAI,MAAM,QAAQ,OAAO,SAAS,GAAG;AAAA,IACnC,IAAI,OAAO,UAAU,WAAW;AAAA,MAAG,MAAM,IAAI,SAAS,KAAK,qCAAqC;AAAA,IAChG,MAAM,SAAqB,CAAC;AAAA,IAC5B,WAAW,QAAO,OAAO,WAAW;AAAA,MAClC,MAAM,QAAQ,aAAa,IAAG;AAAA,MAC9B,IAAI,OAAO,MAAM,iBAAiB,YAAY,CAAC,YAAY,KAAK,MAAM,YAAY,KAAK,EAAE,cAAc,QAAQ;AAAA,QAC7G,MAAM,IAAI,SAAS,KAAK,0DAA0D;AAAA,MACpF;AAAA,MACA,OAAO,MAAM,gBAAgB,MAAM,YAAY;AAAA,IACjD;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,EAAE,cAAc;AAAA,IAAS,MAAM,IAAI,SAAS,KAAK,yCAAyC;AAAA,EAC9F,IAAI,OAAO,iBAAiB;AAAA,IAAW,OAAO,OAAO;AAAA,EACrD,IAAI,OAAO,OAAO,iBAAiB,YAAY,CAAC,YAAY,KAAK,OAAO,YAAY,GAAG;AAAA,IACrF,MAAM,IAAI,SAAS,KAAK,wBAAwB,mBAAmB;AAAA,EACrE;AAAA,EACA,OAAO,GAAG,OAAO,eAAe,OAAO,SAAS;AAAA;AAGlD,SAAS,OAAO,CAAC,QAA+B;AAAA,EAC9C,MAAM,SAAS,gBAAgB,UAAU;AAAA,IACvC,cAAc,OAAO;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC1B,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO;AAAA,IACzB,iBAAiB,OAAO;AAAA,IACxB,oBAAoB,OAAO,qBAAqB,OAAO;AAAA,EACzD,CAAC;AAAA,EACD,IAAI,CAAC,OAAO;AAAA,IAAS,MAAM,IAAI,SAAS,KAAK,OAAO,MAAM,OAAO,IAAI,WAAW,0BAA0B;AAAA,EAC1G,OAAO,OAAO;AAAA;AAGT,IAAM,cAAc,IAAI;AAE/B,YAAY,KAAK,oCAAoC,OAAO,aAAY;AAAA,EACtE,IAAI,CAAC,SAAS;AAAA,IAAuB,MAAM,IAAI,SAAS,KAAK,+CAA+C;AAAA,EAC5G,MAAM,OAAO,MAAM,UAAU,UAAS,wBAAwB;AAAA,EAC9D,MAAM,UAAU,KAAK,SAAS,OAAO,CAAC,YAAY,CAAC,2BAA2B,OAAO,CAAC;AAAA,EACtF,IAAI,QAAQ;AAAA,IAAQ,MAAM,IAAI,SAAS,KAAK,yBAAyB,QAAQ,KAAK,IAAI,GAAG;AAAA,EACzF,MAAM,WAAW,SAAQ,IAAI,MAAM,UAAU;AAAA,EAC7C,MAAM,SAAS,SAAQ,IAAI,MAAM,EAAE;AAAA,EAGnC,MAAM,iBAAiB,UAAU,QAAQ,sBAAsB,QAAO,CAAC;AAAA,EACvE,OAAO,oBAAoB,UAAS,UAAU,QAAQ,IAAI;AAAA,CAC3D;AAED,YAAY,KAAK,+BAA+B,OAAO,aAAY;AAAA,EACjE,IAAI,CAAC,SAAS;AAAA,IAAuB,MAAM,IAAI,SAAS,KAAK,+CAA+C;AAAA,EAC5G,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,MAAM,UAAU,UAAS,aAAa;AAAA,IAC7C,OAAO,OAAO;AAAA,IACd,IAAI,iBAAiB,YAAY,MAAM,WAAW,KAAK;AAAA,MACrD,OAAO,SAAQ,KAAK,QAAQ,MAAM,oBAAoB,MAAM,OAAO,CAAC;AAAA,IACtE;AAAA,IACA,MAAM;AAAA;AAAA,EAER,MAAM,WAAW,SAAQ,IAAI,MAAM,UAAU;AAAA,EAC7C,MAAM,OAAO,SAAQ,IAAI,MAAM;AAAA,EAC/B,MAAM,SAAS,MAAM,iBAAiB,UAAU,KAAK,UAAU,sBAAsB,QAAO,CAAC;AAAA,EAC7F,IAAI;AAAA,IACF,IAAI,KAAK,WAAW,aAAa;AAAA,MAC/B,MAAM,cAAc,UAAU,KAAK,OAAO,UAAU,cAAc,MAAM,GAAG,OAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC,EAAE,KAAK,OAAO,EACvH,MAAM,KAAI,IAAG,QAAQ,WAAW,QAAQ,GAAG,IAAG,QAAQ,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,WAAW;AAAA,MAC5G,QAAQ,OAAO,gBAAgB,SAAS,KAAK;AAAA,MAC7C,MAAM,SAAqB,cACvB,KAAK,MAAM,SAAS,EAAE,QAAQ,eAAe,KAAK,EAAE,IACpD,KAAK;AAAA,MACT,MAAM,MAAM,QAAQ,MAAM;AAAA,MAC1B,IAAI,qBAAqB;AAAA,MACzB,MAAM,SAAS,MAAM,qBAAqB,UAAS,UAAU,KAAK,CAAC,MAAM;AAAA,MACzE,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,IACA,IAAI,KAAK,WAAW,iBAAiB;AAAA,MACnC,IAAI,CAAC;AAAA,QAAQ,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,eAAe,kCAAkC,CAAC;AAAA,MACpG,MAAM,SAAS,MAAM,GAAG,OAAO,EAAE,cAAc,KAAK,aAAa,CAAC,EAAE,KAAK,IAAI,EAC1E,MAAM,KAAI,IAAG,KAAK,WAAW,QAAQ,GAAG,IAAG,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE,QAAQ,MAAK,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC;AAAA,MACnH,MAAM,cAAc,OAAO,KAAK,OAAO,iBAAiB,WAAW,KAAK,OAAO,eAAe,OAAO,IAAI;AAAA,MACzG,IAAI,CAAC;AAAA,QAAa,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,eAAe,kCAAkC,CAAC;AAAA,MACzG,MAAM,gBAAgB,gBAAgB,UAAU;AAAA,QAC9C,cAAc,OAAO,WAAW;AAAA,QAAG,SAAS,EAAE,QAAQ,YAAY,KAAK,MAAM,EAAE;AAAA,QAC/E,QAAQ,KAAK,OAAO,UAAU,CAAC;AAAA,QAAG,UAAU,KAAK,OAAO;AAAA,MAC1D,CAAC;AAAA,MACD,IAAI,CAAC,cAAc;AAAA,QAAS,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,oBAAoB,cAAc,MAAM,OAAO,IAAI,WAAW,gBAAgB,CAAC;AAAA,MAChJ,MAAM,aAAwB,KAAK,cAAc,MAAM,oBAAoB,KAAK;AAAA,MAChF,MAAM,SAAS,MAAM,qBAAqB,UAAS,UAAU,UAAU;AAAA,MACvE,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,IACA,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,mBAAmB,oBAAoB,KAAK,UAAU,CAAC;AAAA,IAC5F,OAAO,OAAO;AAAA,IACd,IAAI,iBAAiB,UAAU;AAAA,MAC7B,MAAM,OAAO,MAAM,YAAY,sBAAsB,sBACjD,MAAM,WAAW,MAAM,gBAAgB,MAAM,WAAW,MAAM,sBAAsB;AAAA,MACxF,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IAC3D;AAAA,IACA,QAAQ,MAAM,KAAK;AAAA,IACnB,OAAO,SAAQ,KAAK,QAAQ,KAAK,IAAI,iBAAiB,YAAY,KAAK,8BAA8B,CAAC;AAAA;AAAA,CAEzG;;;AC5ID;AAEA;AAHA,iBAAS;AAKF,IAAM,eAAe,IAAI;AAEhC,aAAa,IAAI,SAAS,CAAC,aACzB,SAAQ,KAAK;AAAA,EACX,MAAM;AAAA,EACN,SAAS,SAAS;AAAA,EAClB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO,EAAE,YAAY,MAAM,OAAO,SAAS,aAAa;AAC1D,CAAC,CACH;AAEA,aAAa,IAAI,WAAW,OAAO,aAAY;AAAA,EAC7C,MAAM,UAAU,MAAM,aAAa;AAAA,EACnC,OAAO,SAAQ,KAAK;AAAA,IAAE,QAAQ,UAAU,YAAY;AAAA,IAAa,UAAU,UAAU,cAAc;AAAA,IACjG,wBAAwB,UAAU,cAAc;AAAA,IAAS,iBAAiB,UAAU,cAAc;AAAA,EAAQ,GAAG,UAAU,MAAM,GAAG;AAAA,CACnI;AAED,aAAa,IAAI,UAAU,OAAO,aAAY;AAAA,EAC5C,MAAM,QAAQ,MAAM,aAAa;AAAA,EACjC,OAAO,SAAQ,KAAK,EAAE,QAAQ,QAAQ,UAAU,YAAY,GAAG,QAAQ,MAAM,GAAG;AAAA,CACjF;AAED,aAAa,IAAI,SAAS,CAAC,aAAY,SAAQ,KAAK,EAAE,QAAQ,QAAQ,CAAC,CAAC;;;ACxBxE;AACA;AALA,iBAAS;AAET,gBAAS,aAAK,cAAK,aAAM,gBAAI,iBAAS;AACtC,cAAS;AAIT;;;ACLA;AACA;AACA;AAJA,cAAS;AACT,gBAAS,aAAK,YAAK,gBAAI,iBAAS,mBAAK,mBAAW;AAKhD;AAGA,IAAM,YAAY,IAAE,OAAO;AAAA,EACzB,UAAU,IAAE,KAAK,CAAC,UAAU,aAAa,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC5D,aAAa,IAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAa,EAAE,QAAQ,KAAM;AAAA,EACpE,wBAAwB,IAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAa,EAAE,QAAQ,CAAC;AAAA,EAC1E,aAAa,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAG;AACtD,CAAC;AASM,SAAS,cAAc,CAAC,MAAwD;AAAA,EACrF,IAAI,OAAO,SAAQ;AAAA,IAAU,OAAO,UAAU,MAAM,IAAG;AAAA,EACvD,MAAM,UAAU,OAAO,IAAG;AAAA,EAC1B,OAAO,UAAU,MAAM,OAAO,SAAS,OAAO,IAAI,EAAE,aAAa,QAAQ,IAAI,KAAK,MAAM,IAAG,CAAC;AAAA;AAG9F,eAAsB,eAAe,GAAyC;AAAA,EAC5E,MAAM,OAAM,SAAS,oBAAoB,SAAS;AAAA,EAClD,IAAI,MAAK,KAAK;AAAA,IAAG,OAAO,eAAe,IAAG;AAAA,EAC1C,MAAM,cAAc,MAAM,WAAW,GAAG,cAAc;AAAA,EACtD,OAAO,aAAa,UAAU,MAAM,UAAU,IAAI;AAAA;AAGpD,eAAsB,gBAAgB,CAAC,SAA0F;AAAA,EAC/H,MAAM,aAAa,MAAM,gBAAgB;AAAA,EACzC,IAAI,CAAC,WAAW,CAAC;AAAA,IAAY;AAAA,EAC7B,MAAM,mBAAmB,SAAS,OAAO,SAAS;AAAA,EAClD,IAAI,CAAC,cAAc,qBAAqB,WAAW;AAAA,IACjD,MAAM,IAAI,SAAS,KAAK,2EAA2E;AAAA,EACrG;AAAA,EACA,OAAO;AAAA,IACL,UAAU,SAAS,YAAY,YAAY,YAAY;AAAA,IACvD,YAAY,oBAAoB,YAAY,eAAe;AAAA,EAC7D;AAAA;AAGF,eAAsB,mBAAmB,CAAC,QAA+D;AAAA,EACvG,MAAM,SAAS,MAAM,gBAAgB,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,EAC5D,OAAO,GAAG,YAAY,OAAO,gBAAgB;AAAA,IAC3C,MAAM,YAAY,YAAY,OAAO,EAAE,OAAO,QAAO,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,KACvE,IAAG,KAAK,WAAW,UAAU,SAAS,GAAG,SAAQ,KAAK,QAAQ,CAAC,WAAW,SAAS,CAAC,CACtF,CAAC;AAAA,IACD,MAAM,OAAO,MAAM,YAAY,OAAO;AAAA,MAAE,WAAW,UAAU;AAAA,MAAW,UAAU,UAAU;AAAA,MAC1F,aAAa,UAAU;AAAA,IAAY,CAAC,EAAE,KAAK,SAAS,EAAE,UAAU,SAAS,IAAG,QAAQ,WAAW,UAAU,SAAS,CAAC,EAClH,MAAM,KAAI,KAAI,UAAU,YAAY,IAAI,IAAM,GAAG,SAAS,IAAG,QAAQ,SAAS,MAAM,IAAI,WACvF,WAAU,SAAS,CAAC,CAAC,EAAE,QAAQ,KAAI,UAAU,UAAU,CAAC,EAAE,MAAM,OAAO,WAAW,EAAE,IAAI,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,IAC1H,IAAI,UAAU;AAAA,IACd,IAAI,SAAS;AAAA,IACb,WAAW,OAAO,MAAM;AAAA,MACtB,IAAI,IAAI,aAAa,eAAe;AAAA,QAClC,MAAM,YAAY,QAAQ;AAAA,gGAC8D,IAAI;AAAA,mCACjE,IAAI,sFAAsF;AAAA,QACrH,MAAM,YAAY,QAAQ,yDAAwD,IAAI;AAAA;AAAA,+CAE/C;AAAA,QACvC,MAAM,YAAY,QAAQ,wDAAuD,IAAI;AAAA;AAAA,+HAEkC;AAAA,QACvH,MAAM,YAAY,OAAO,SAAS,EAAE,IAAI,EAAE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,cAAc,KAAM,EAAE,CAAC,EACpG,MAAM,IAAG,UAAU,WAAW,IAAI,SAAS,CAAC;AAAA,QAC/C,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACA,MAAM,wBAAwB,IAAI,SAAS;AAAA,MAC3C,MAAM,UAAU,MAAM,YAAY,OAAO,OAAO,EAAE,MAAM,IAAG,QAAQ,WAAW,IAAI,SAAS,CAAC,EACzF,UAAU,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,MAC7C,IAAI,QAAQ;AAAA,QAAQ,WAAW;AAAA,IACjC;AAAA,IACA,OAAO,EAAE,SAAS,OAAO;AAAA,GAC1B;AAAA;AAGH,IAAI;AAEJ,eAAsB,qBAAqB,GAAkB;AAAA,EAC3D,MAAM,SAAS,MAAM,gBAAgB;AAAA,EACrC,IAAI,CAAC,UAAU;AAAA,IAAO;AAAA,EACjB,oBAAoB,EAAE,MAAM,CAAC,UAAmB,QAAQ,MAAM,2BAA2B,KAAK,CAAC;AAAA,EACpG,SAAQ,YAAY,MAAM,KAAK,oBAAoB,EAAE,MAAM,CAAC,UAAmB,QAAQ,MAAM,2BAA2B,KAAK,CAAC,GAC5H,OAAO,yBAAyB,KAAM;AAAA;AAGnC,SAAS,oBAAoB,GAAS;AAAA,EAC3C,IAAI;AAAA,IAAO,cAAc,MAAK;AAAA,EAC9B,SAAQ;AAAA;;;ADpFV,IAAM,gBAAe,IAAE,OAAO;AAAA,EAC5B,UAAU,iBAAiB,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChD,eAAe,iBAAiB,SAAS,EAAE,SAAS;AAAA,EACpD,WAAW,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACtC,UAAU,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrC,WAAW,IAAE,KAAK,CAAC,SAAS,YAAY,CAAC,EAAE,SAAS;AAAA,EACpD,UAAU,IAAE,KAAK,CAAC,SAAS,YAAY,CAAC,EAAE,SAAS;AAAA,EACnD,KAAK,IAAE,OAAO,EAAE,KAAK,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,aAAa,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,UAAU,IAAE,KAAK,CAAC,UAAU,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS;AACtL,CAAC;AACD,IAAM,gBAAe,IAAE,OAAO,EAAE,UAAU,iBAAiB,SAAS,EAAE,CAAC;AACvE,IAAM,gBAAe,IAAE,OAAO;AAAA,EAC5B,UAAU,iBAAiB,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChD,QAAQ,IAAE,KAAK,CAAC,QAAQ,QAAQ,eAAe,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7E,OAAO,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EACxD,QAAQ,IAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC3D,SAAS,IAAE,KAAK,CAAC,aAAa,UAAU,cAAc,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACzF,YAAY,IAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACxD,UAAU,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC3C,CAAC;AACD,IAAM,oBAAoB,IAAE,OAAO;AAAA,EACjC,QAAQ,IAAE,MAAM,CAAC,kBAAkB,IAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACnF,YAAY,iBAAiB,SAAS,EAAE,SAAS;AAAA,EACjD,eAAe,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,SAAS,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,eAAe,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,WAAW,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,cAAc,IAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,KAA4C;AAAA,EAC1D,OAAO;AAAA,IACL,WAAW,OAAO,IAAI,SAAS;AAAA,IAC/B,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,UAAU,aAAa,IAAI,iBAAiB,IAAI,QAAQ;AAAA,IACxD,SAAS,OAAO,IAAI,OAAO;AAAA,IAC3B,YAAY,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY;AAAA,IACzD,YAAY,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY;AAAA,EAC3D;AAAA;AAGK,SAAS,WAAW,CAAC,UAAkB,YAAgD;AAAA,EAC5F,OAAO,EAAE,cAAc;AAAA,OAAM,cAAc,CAAC;AAAA,IAAI,WAAW;AAAA,IACzD,eAAe,OAAO,YAAY,kBAAkB,WAAW,WAAW,gBAAgB;AAAA,EAAG,EAAE;AAAA;AAGnG,SAAS,qBAAoB,CAAC,UAAsD;AAAA,EAClF,MAAM,QAAQ,sBAAsB,QAAO;AAAA,EAC3C,MAAM,WAAW,aAAa,MAAM,QAAQ;AAAA,EAC5C,OAAO;AAAA,IACL,OAAO,MAAM,cAAc,WAAW,IAAG,QAAQ,WAAW,MAAM,SAAS,IAAI;AAAA,IAC/E,OAAO,MAAM,WAAW,WAAW,IAAG,QAAQ,QAAQ,MAAM,MAAM,IAAI;AAAA,IACtE,OAAO,KAAK,QAAQ,EAAE,SAAS,OAAM,QAAQ,oBAAoB,KAAK,UAAU,QAAQ,aAAa;AAAA,EACvG,EAAE,OAAO,CAAC,WAA0B,WAAW,SAAS;AAAA;AAG1D,eAAe,YAAW,CAAC,UAAkB,UAAsE;AAAA,EACjH,MAAM,OAAO,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAI,IAAG,QAAQ,WAAW,QAAQ,GACnF,IAAG,QAAQ,SAAS,SAAQ,IAAI,MAAM,EAAE,QAAQ,GAAG,GAAG,sBAAqB,QAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC/F,IAAI,CAAC,KAAK;AAAA,IAAI,MAAM,IAAI,SAAS,KAAK,kBAAkB;AAAA,EACxD,OAAO,OAAO,KAAK,EAAE;AAAA;AAGvB,eAAe,cAAc,CAAC,UAAkB,UAA+C;AAAA,EAC7F,MAAM,OAAO,SAAQ,IAAI,MAAM;AAAA,EAC/B,MAAM,SAAS,KAAK;AAAA,EACpB,MAAM,QAAQ,MAAM,aAAY,UAAU,QAAO;AAAA,EACjD,MAAM,UAAU,OAAO,MAAM,SAAS,aAAa,WAAW,MAAM,SAAS,WAAW;AAAA,EACxF,IAAI;AAAA,IAAS,OAAO,SAAS,SAAS,EAAE,MAAM,eAAe,gBAAgB,QAAQ,YAAY,QAAQ,EAAE,CAAC;AAAA,EAC5G,MAAM,OAAO,MAAM,GAAG,OAAO,EAAE,UAAU,WAAW,SAAS,CAAC,EAAE,KAAK,UAAU,EAAE,UAAU,MAAM,IAAG,KAAK,cAAc,WAAW,YAAY,CAAC,EAC5I,MAAM,KAAI,IAAG,KAAK,WAAW,QAAQ,GAAG,IAAG,KAAK,SAAS,MAAM,CAAC,CAAC,EAAE,QAAQ,MAAK,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC;AAAA,EAC5G,IAAI,CAAC,KAAK;AAAA,IAAI;AAAA,EACd,OAAO,SAAS,OAAO,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,eAAe,gBAAgB,QAAQ,YAAY,QAAQ,EAAE,CAAC;AAAA;AAGlH,SAAS,UAAU,CAAC,UAA2C;AAAA,EAC7D,MAAM,aAAa,EAAE,eAAe,MAAM,WAAW,UAAU,eAAe,GAAG;AAAA,EACjF,OAAO;AAAA,IAAE,QAAQ,CAAC;AAAA,IAAG,MAAM,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,IAAG,YAAY,CAAC;AAAA,IAAG,UAAU,CAAC;AAAA,IAAG,YAAY;AAAA,IAClF;AAAA,IAAY,mBAAmB;AAAA,IAAM,eAAe;AAAA,IAAM,sBAAsB;AAAA,EAAK;AAAA;AAGzF,SAAS,cAAc,CAAC,OAAyB;AAAA,EAC/C,IAAI,CAAC,SAAS,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EAChD,MAAM,QAAQ;AAAA,EACd,MAAM,SAAS,aAAa,MAAM,MAAM;AAAA,EACxC,MAAM,SAAS,MAAM,eAAe,aAAa,MAAM,YAAY,IAAI;AAAA,EACvE,OAAO;AAAA,IACL,QAAQ,aAAa,MAAM,MAAM;AAAA,IAAG,MAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;AAAA,IACpF,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA,IAChE,YAAY,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,MAAM,QAAQ,CAAC,SAAS;AAAA,MACrE,MAAM,aAAa,aAAa,IAAI,EAAE;AAAA,MACtC,OAAO,MAAM,QAAQ,UAAU,IAAI,WAAW,IAAI,YAAY,IAAI,CAAC;AAAA,KACpE,IAAI,CAAC;AAAA,IAAG,UAAU,aAAa,MAAM,QAAQ;AAAA,IAC9C,YAAY,MAAM,aAAa;AAAA,IAAM,YAAY,aAAa,OAAO,YAAY;AAAA,IACjF,mBAAmB,SAAS,aAAa,OAAO,YAAY,IAAI;AAAA,IAChE,eAAe,aAAa,OAAO,YAAY,EAAE,iBAAiB;AAAA,IAClE,sBAAsB,SAAS,aAAa,OAAO,YAAY,EAAE,iBAAiB,OAAO;AAAA,EAC3F;AAAA;AAGK,IAAM,eAAe,IAAI;AAEhC,aAAa,KAAK,YAAY,OAAO,aAAY;AAAA,EAC/C,MAAM,OAAO,MAAM,UAAU,UAAS,aAAY;AAAA,EAClD,MAAM,KAAK,KAAK,aAAa,KAAK,YAAY,OAAO,WAAW;AAAA,EAChE,MAAM,WAAW,KAAK,aAAa,KAAK,YAAY;AAAA,EACpD,MAAM,SAAS,SAAQ,IAAI,MAAM,EAAE;AAAA,EACnC,MAAM,MAAM,MAAM,iBAAiB,KAAK,GAAG;AAAA,EAE3C,MAAM,WAAW,KAAM,KAAK,YAAY,CAAC,MAAO,mBAAmB,QAAO,EAAE;AAAA,EAC5E,MAAM,UAAU,MAAM,GAAG,YAAY,OAAO,gBAAgB;AAAA,IAC1D,MAAM,OAAO,MAAM,YAAY,OAAO,OAAO,EAAE,OAAO;AAAA,MAAE,WAAW;AAAA,MACjE,eAAe,sBAAsB,QAAQ,QAAQ;AAAA,MAAG,SAAS;AAAA,IAAO,CAAC,EACxE,oBAAoB,EAAE,UAAU;AAAA,IACnC,IAAI,KAAK,MAAM;AAAA,MAAK,MAAM,YAAY,OAAO,SAAS,EAAE,OAAO;AAAA,QAAE,WAAW;AAAA,QAAI,UAAU,IAAI;AAAA,QAC5F,aAAa,IAAI;AAAA,QAAY,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,aAAa,KAAM;AAAA,MAAE,CAAC;AAAA,IAC3F,OAAO;AAAA,GACR;AAAA,EACD,IAAI,QAAQ;AAAA,IAAI,OAAO,SAAQ,KAAK,OAAO,QAAQ,EAAE,CAAC;AAAA,EACtD,MAAM,WAAW,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAI,IAAG,QAAQ,WAAW,EAAE,GAAG,IAAG,QAAQ,SAAS,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC3H,IAAI,SAAS,MAAM,aAAa;AAAA,IAAc,OAAO,SAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,EACrF,MAAM,IAAI,SAAS,KAAK,uBAAuB;AAAA,CAChD;AAED,aAAa,IAAI,YAAY,OAAO,aAAY;AAAA,EAC9C,MAAM,SAAS,SAAQ,IAAI,MAAM,EAAE;AAAA,EACnC,MAAM,UAAU,sBAAqB,QAAO;AAAA,EAC5C,MAAM,OAAO,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAI,IAAG,QAAQ,SAAS,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,QAAQ,MAAK,QAAQ,UAAU,CAAC;AAAA,EACjI,OAAO,SAAQ,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC;AAAA,CACpF;AAED,aAAa,KAAK,mBAAmB,OAAO,aAAY;AAAA,EACtD,MAAM,OAAO,MAAM,UAAU,UAAS,aAAY;AAAA,EAClD,MAAM,SAAS,SAAQ,IAAI,MAAM,EAAE;AAAA,EACnC,MAAM,SAAS,KAAK,UAAU,MAAM,+DAA+D;AAAA,EACnG,IAAI,KAAK,YAAY,CAAC;AAAA,IAAQ,MAAM,IAAI,SAAS,KAAK,kBAAkB;AAAA,EACxE,MAAM,YAAa,KAAK,WAAW,SAAS,IAAI,YAAY,KAAK;AAAA,EACjE,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,OAAO,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAI,IAAG,QAAQ,SAAS,MAAM,GAC/E,KAAK,SAAS,IAAG,QAAQ,QAAQ,KAAK,MAAM,IAAI,WAAW,OAAM,QAAQ,oBAAoB,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC,UAAU,CAAC,EACzI,SAAS,KAAK,cAAc,SAAS,IAAI,YAAY,OAAO,QAAQ,KAAI,KAAK,IAAI,MAAK,KAAK,CAAC,EAC5F,MAAM,WAAW,KAAK,OAAO,IAAI,SAAS,gBAAgB,CAAC,EAAE,OAAO,KAAK,UAAU,CAAC;AAAA,EACvF,OAAO,SAAQ,KAAK,KAAK,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC;AAAA,CACnD;AAED,aAAa,IAAI,sBAAsB,OAAO,aAC5C,SAAQ,KAAK,MAAM,aAAY,SAAQ,IAAI,MAAM,UAAU,GAAG,QAAO,CAAC,CACxE;AAEA,aAAa,MAAM,sBAAsB,OAAO,aAAY;AAAA,EAC1D,MAAM,OAAO,MAAM,UAAU,UAAS,aAAY;AAAA,EAClD,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,SAAS,SAAQ,IAAI,MAAM,EAAE;AAAA,EACnC,MAAM,QAAQ,KAAM,KAAK,YAAY,CAAC,MAAO,mBAAmB,QAAO,EAAE;AAAA,EACzE,MAAM,OAAO,MAAM,GAAG,OAAO,OAAO,EAAE,IAAI,EAAE,eAAe,OAAM,QAAQ,oBAAoB,KAAK,UAAU,KAAK,YAAY,YAAY,IAAI,KAAO,CAAC,EAClJ,MAAM,KAAI,IAAG,QAAQ,WAAW,EAAE,GAAG,IAAG,QAAQ,SAAS,MAAM,GAAG,GAAG,sBAAqB,QAAO,CAAC,CAAC,EAAE,UAAU;AAAA,EAClH,IAAI,CAAC,KAAK;AAAA,IAAI,MAAM,IAAI,SAAS,KAAK,kBAAkB;AAAA,EACxD,OAAO,SAAQ,KAAK,OAAO,KAAK,EAAE,CAAC;AAAA,CACpC;AAED,aAAa,OAAO,sBAAsB,OAAO,aAAY;AAAA,EAC3D,MAAM,WAAW,SAAQ,IAAI,MAAM,UAAU;AAAA,EAC7C,MAAM,aAAY,UAAU,QAAO;AAAA,EAGnC,WAAW,OAAO,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,EACjE,MAAM,KAAI,IAAG,KAAK,WAAW,QAAQ,GAAG,SAAQ,KAAK,QAAQ,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC,GAAG;AAAA,IACzF,MAAM,gBAAgB,OAAO,IAAI,MAAM,CAAC;AAAA,EAC1C;AAAA,EACA,MAAM,wBAAwB,QAAQ;AAAA,EACtC,MAAM,OAAO,MAAM,GAAG,OAAO,OAAO,EAAE,MAAM,KAAI,IAAG,QAAQ,WAAW,QAAQ,GAC5E,IAAG,QAAQ,SAAS,SAAQ,IAAI,MAAM,EAAE,QAAQ,GAAG,GAAG,sBAAqB,QAAO,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,EAClI,IAAI,CAAC,KAAK;AAAA,IAAI,MAAM,IAAI,SAAS,KAAK,kBAAkB;AAAA,EACxD,OAAO,SAAQ,KAAK,EAAE,QAAQ,UAAU,CAAC;AAAA,CAC1C;AAED,aAAa,KAAK,kBAAkB,OAAO,aAAY,SAAQ,KAAK,MAAM,oBAAoB,SAAQ,IAAI,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE5H,aAAa,IAAI,4BAA4B,OAAO,aAAY;AAAA,EAC9D,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,QAAQ,MAAM,eAAe,IAAI,QAAO;AAAA,EAC9C,IAAI,CAAC;AAAA,IAAO,OAAO,SAAQ,KAAK,WAAW,EAAE,CAAC;AAAA,EAC9C,IAAI,CAAC,MAAM;AAAA,IAAU,MAAM,IAAI,SAAS,KAAK,6BAA6B;AAAA,EAC1E,MAAM,gBAAgB,SAAQ,IAAI,MAAM,eAAe;AAAA,EACvD,MAAM,QAAQ,MAAM,MAAM,SAAS,YAAY,IAAI,gBAAgB,EAAE,cAAc,IAAI,SAAS,GAC9F,EAAE,WAAW,SAAQ,IAAI,MAAM,WAAW,MAAM,OAAO,CAAC;AAAA,EAC1D,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,SAAS,KAAK,gBAAgB;AAAA,EACpD,OAAO,SAAQ,KAAK,eAAe,KAAK,CAAC;AAAA,CAC1C;AAED,aAAa,IAAI,0CAA0C,OAAO,aAAY;AAAA,EAC5E,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,QAAQ,MAAM,eAAe,IAAI,QAAO;AAAA,EAC9C,IAAI,CAAC,OAAO;AAAA,IAAU,MAAM,IAAI,SAAS,KAAK,6BAA6B;AAAA,EAC3E,MAAM,gBAAgB,SAAQ,IAAI,MAAM,eAAe;AAAA,EACvD,MAAM,QAAQ,MAAM,MAAM,SAAS,YAAY,IAAI;AAAA,IAAE,eAAe,SAAQ,IAAI,MAAM,cAAc;AAAA,OAC9F,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,EAAE,WAAW,SAAQ,IAAI,MAAM,WAAW,MAAM,OAAO,CAAC;AAAA,EAC1G,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,SAAS,KAAK,gBAAgB;AAAA,EACpD,OAAO,SAAQ,KAAK,eAAe,KAAK,CAAC;AAAA,CAC1C;AAED,aAAa,KAAK,uCAAuC,OAAO,aAAY;AAAA,EAC1E,MAAM,OAAO,MAAM,UAAU,UAAS,IAAE,OAAO,EAAE,YAAY,kBAAkB,WAAW,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,EAC9H,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,QAAQ,MAAM,eAAe,IAAI,QAAO;AAAA,EAC9C,IAAI,CAAC,OAAO;AAAA,IAAU,MAAM,IAAI,SAAS,KAAK,6BAA6B;AAAA,EAC3E,MAAM,eAAe,KAAK,WAAW;AAAA,EACrC,IAAI,OAAO,iBAAiB,YAAY,CAAC;AAAA,IAAc,MAAM,IAAI,SAAS,KAAK,2BAA2B;AAAA,EAC1G,MAAM,QAAQ,MAAM,MAAM,SAAS,YAAY,IAAI,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,aAAa,MAAM,CAAC;AAAA,EAC3G,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,SAAS,KAAK,gBAAgB;AAAA,EACpD,OAAO,SAAQ,KAAK,eAAe,KAAK,CAAC;AAAA,CAC1C;AAED,aAAa,KAAK,4BAA4B,OAAO,aAAY;AAAA,EAC/D,MAAM,OAAO,MAAM,UAAU,UAAS,iBAAiB;AAAA,EACvD,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,QAAQ,MAAM,eAAe,IAAI,QAAO;AAAA,EAC9C,IAAI,KAAK,UAAU,QAAQ,CAAC,KAAK,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,YAAY;AAAA,IACnF,IAAI,CAAC;AAAA,MAAO,OAAO,SAAQ,KAAK,WAAW,EAAE,CAAC;AAAA,IAC9C,IAAI,CAAC,MAAM;AAAA,MAAU,MAAM,IAAI,SAAS,KAAK,6BAA6B;AAAA,IAC1E,MAAM,QAAQ,MAAM,MAAM,SAAS,YAAY,IAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,SAAS,GACvH,EAAE,WAAW,KAAK,aAAa,MAAM,CAAC;AAAA,IACxC,IAAI,CAAC;AAAA,MAAO,MAAM,IAAI,SAAS,KAAK,gBAAgB;AAAA,IACpD,OAAO,SAAQ,KAAK,eAAe,KAAK,CAAC;AAAA,EAC3C;AAAA,EACA,IAAI,CAAC,OAAO;AAAA,IAAa,MAAM,IAAI,SAAS,KAAK,gCAAgC;AAAA,EACjF,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,GAAG,GAAG,KAAK,MAAM,IAAI,KAAK,UAAU;AAAA,EAC/F,MAAM,aAAa,MAAM,MAAM,YAC7B,YAAY,IAAI;AAAA,OAAM,KAAK,cAAc,CAAC;AAAA,OAAQ,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,OAC1G,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,EAAG,CAAC,GACxE,QAAQ,KAAK,WAAW,SAC1B;AAAA,EACA,OAAO,SAAQ,KAAK,EAAE,YAAY,YAAY,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC;AAAA,CAC/E;AAED,eAAe,eAAe,CAAC,UAA+C,MAGxD;AAAA,EACpB,MAAM,KAAK,SAAQ,IAAI,MAAM,UAAU;AAAA,EACvC,MAAM,QAAQ,MAAM,eAAe,IAAI,QAAO;AAAA,EAC9C,IAAI,CAAC;AAAA,IAAO,OAAO,SAAQ,KAAK,CAAC,CAAC;AAAA,EAClC,IAAI,CAAC,MAAM;AAAA,IAAiB,MAAM,IAAI,SAAS,KAAK,+BAA+B;AAAA,EACnF,MAAM,SAAoB,CAAC;AAAA,EAC3B,MAAM,SAAS,OAAO,KAAK,WAAW,WAAW,YAAY,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,IAC3F,KAAK,WAAU,kBAAkB,KAAK,UAAS,KAAK,SACpD,KAAK,SAAS,YAAY,IAAI,KAAK,MAAM,IAAI;AAAA,EACjD,MAAM,SAAS,YAAY,IAAI,KAAM,KAAK,cAAc,CAAC,MAAQ,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC,EAAG,CAAC;AAAA,EACnI,iBAAiB,SAAS,MAAM,gBAAgB,QAAQ;AAAA,IACtD,OAAO,KAAK,SAAS;AAAA,IAAI;AAAA,IAAQ,QAAQ,KAAK,YAAY;AAAA,IAAW,WAAW,KAAK,aAAa;AAAA,EACpG,CAAC;AAAA,IAAG,OAAO,KAAK,eAAe,KAAK,CAAC;AAAA,EACrC,OAAO,SAAQ,KAAK,MAAM;AAAA;AAG5B,aAAa,KAAK,8BAA8B,OAAO,aAAY;AAAA,EACjE,MAAM,OAAO,MAAM,UAAU,UAAS,IAAE,OAAO;AAAA,IAC7C,OAAO,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,IAClE,QAAQ,IAAE,MAAM,CAAC,kBAAkB,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,UAAU,iBAAiB,SAAS,EAAE,SAAS;AAAA,IACtH,YAAY,iBAAiB,SAAS,EAAE,SAAS;AAAA,IAAG,eAAe,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAClG,WAAW,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,CAAC,CAAC;AAAA,EACF,OAAO,gBAAgB,UAAS,IAAI;AAAA,CACrC;AACD,aAAa,IAAI,8BAA8B,CAAC,aAAY;AAAA,EAC1D,IAAI;AAAA,EACJ,MAAM,cAAc,SAAQ,IAAI,MAAM,UAAU;AAAA,EAChD,IAAI,aAAa;AAAA,IACf,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,MAAM,WAAW;AAAA,MACrC,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM;AAAA,QAAG,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAChH,WAAW;AAAA,MACX,OAAO,OAAO;AAAA,MACd,MAAM,IAAI,SAAS,KAAK,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;AAAA;AAAA,EAEzH;AAAA,EACA,OAAO,gBAAgB,UAAS;AAAA,IAC9B,OAAO,WAAW,SAAQ,IAAI,MAAM,OAAO,GAAG,EAAE;AAAA,IAAG,QAAQ,SAAQ,IAAI,MAAM,QAAQ;AAAA,IACrF,eAAe,SAAQ,IAAI,MAAM,eAAe;AAAA,IAAG,WAAW,SAAQ,IAAI,MAAM,WAAW,MAAM;AAAA,OAC7F,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC,CAAC;AAAA,CACF;;;AtBjRD,eAAsB,SAAS,GAA+C;AAAA,EAC5E,MAAM,SAAS,MAAM,WAAW;AAAA,EAChC,MAAM,eAAe;AAAA,EACrB,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,aAAa,OAAO,MAAM;AAAA,EAChC,IAAI,IAAI,KAAK,KAAK;AAAA,IAChB,QAAQ,YAAY,iBAAiB;AAAA,IACrC,cAAc,YAAY,iBAAiB,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,SAAS;AAAA,IAC9F,cAAc,YAAY,iBAAiB,CAAC,GAAG;AAAA,IAC/C,eAAe,YAAY,kBAAkB,CAAC,oBAAoB,UAAU;AAAA,IAC5E,aAAa,YAAY,qBAAqB;AAAA,IAC9C,QAAQ,YAAY,WAAW;AAAA,EACjC,CAAC,CAAC;AAAA,EACF,IAAI,IAAI,KAAK,wBAAwB;AAAA,EAErC,IAAI,SAAS,2BAA2B;AAAA,IACtC,QAAQ,cAAc,oBAAoB,WAAW;AAAA,IACrD,IAAI,IAAI,KAAK,eAAe;AAAA,IAC5B,IAAI,IAAI,YAAY,YAAY;AAAA,EAClC;AAAA,EAEA,IAAI,MAAM,KAAK,YAAY;AAAA,EAE3B,IAAI,MAAM,KAAK,UAAU;AAAA,EACzB,MAAM,MAAM,IAAI;AAAA,EAChB,IAAI,IAAI,KAAK,cAAc;AAAA,EAC3B,IAAI,MAAM,KAAK,eAAe;AAAA,EAC9B,IAAI,MAAM,KAAK,YAAY;AAAA,EAC3B,IAAI,MAAM,KAAK,SAAS;AAAA,EACxB,IAAI,MAAM,KAAK,UAAU;AAAA,EACzB,IAAI,MAAM,KAAK,WAAW;AAAA,EAC1B,IAAI,MAAM,KAAK,WAAW;AAAA,EAC1B,IAAI,MAAM,KAAK,GAAG;AAAA,EAElB,IAAI,OAAO,MAAM,KAAK;AAAA,IACpB,MAAM,SAAS,MAAM,cAAc,OAAO,KAAK,GAAG;AAAA,IAClD,IAAI,OAAO,KAAK,0BAA0B;AAAA,MACxC,MAAM,gBAAgB,IAAI;AAAA,MAC1B,cAAc,IAAI,KAAK,cAAc;AAAA,MACrC,cAAc,MAAM,KAAK,MAAM;AAAA,MAC/B,IAAI,MAAM,KAAK,aAAa;AAAA,IAC9B,EAAO;AAAA,MACL,IAAI,MAAM,KAAK,MAAM;AAAA;AAAA,EAEzB;AAAA,EAEA,IAAI,IAAI,KAAK,CAAC,aAAY,SAAQ,KAAK,EAAE,SAAS,SAAS,cAAc,SAAS,SAAS,SAAS,QAAQ,UAAU,CAAC,CAAC;AAAA,EACxH,IAAI,SAAS,CAAC,aAAY,SAAQ,KAAK,UAAU,IAAI,SAAS,KAAK,iBAAiB,CAAC,GAAG,GAAG,CAAC;AAAA,EAC5F,IAAI,QAAQ,CAAC,OAAO,aAAY;AAAA,IAC9B,IAAI,iBAAiB;AAAA,MAAU,OAAO,SAAQ,KAAK,UAAU,KAAK,GAAG,MAAM,MAAa;AAAA,IACxF,QAAQ,MAAM,KAAK;AAAA,IACnB,OAAO,SAAQ,KAAK,EAAE,OAAO,kBAAkB,SAAS,gCAAgC,SAAS,KAAK,GAAG,GAAG;AAAA,GAC7G;AAAA,EACD,OAAO;AAAA;AAGT,eAAsB,aAAa,CAAC,MAAiC;AAAA,EACnE,QAAQ,UAAU,YAAY,eAAe,MAAM,iBAAiB,MAAM;AAAA,IACxE,eAAe;AAAA,IACf,MAAM;AAAA,IACN,eAAe;AAAA,EACjB,CAAC;AAAA,EACD,IAAI,CAAC,YAAY,OAAO,aAAa,YAAY,OAAQ,SAAiC,UAAU,YAAY;AAAA,IAC9G,MAAM,IAAI,MAAM,oBAAoB,kBAAkB,yCAAyC;AAAA,EACjG;AAAA,EACA,OAAO;AAAA;;;AwBnFT;AACA;;;ACHA;AAGA;AAFA;AACA,gBAAS,cAAK,YAAK,kBAAU,WAAI;AAGjC;AAKA,IAAI,UAAU;AACd,IAAI,cAA+B,CAAC;AACpC,IAAI;AACJ,IAAM,aAAa,GAAG,SAAS,KAAK,QAAQ;AAE5C,eAAe,UAAU,CAAC,QAA8B;AAAA,EACtD,MAAM,SAAQ,MAAM,sBAAsB;AAAA,EAC1C,IAAI,CAAC;AAAA,IAAO;AAAA,EACZ,IAAI;AAAA,IACF,OAAO,SAAS;AAAA,MACd,IAAI;AAAA,MACJ,IAAI;AAAA,QAAE,SAAS,MAAM,OAAM,MAAM,SAAS,kBAAkB,CAAC,KAAK;AAAA,QAClE,OAAO,OAAO;AAAA,QACZ,QAAQ,KAAK,mDAAmD,KAAK;AAAA,QACrE,MAAM,IAAI,MAAM,SAAS,iCAAiC,IAAI;AAAA,QAC9D,SAAS,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,KAAG,KAAK,QAAQ,SAAS,CAAC,EAC1F,QAAQ,KAAI,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI;AAAA;AAAA,MAEjD,IAAI,CAAC;AAAA,QAAO;AAAA,MACZ,IAAI;AAAA,QACF,MAAM,OAAO,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAI,KAAG,KAAK,QAAQ,KAAK,GAAG,KAAG,KAAK,QAAQ,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,QAChH,IAAI,CAAC,KAAK;AAAA,UAAI;AAAA,QACd,MAAM,SAAS,WAAW,KAAK,EAAE;AAAA,QACjC,MAAM,OAAO,aAAa,KAAK,GAAG,gBAAgB;AAAA,QAClD,MAAM,OAAiB,EAAE,UAAU,OAAO,SAAS,iBAAiB,MAAM,aAAa,CAAC,EAAE;AAAA,QAC1F,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,mBAAmB,QAAQ,QAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,QACtF,MAAM,WAAW,QAAQ,MAAM,MAAM,GAAG,cAAc,QAAO;AAAA,QAC7D,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM,qBAAqB,OAAO,KAAK;AAAA;AAAA,IAEnD;AAAA,YACA;AAAA,IACA,IAAI;AAAA,MAAE,MAAM,OAAM,KAAK;AAAA,MACvB,OAAO,OAAO;AAAA,MAAE,QAAQ,KAAK,gCAAgC,KAAK;AAAA;AAAA;AAAA;AAItE,eAAsB,iBAAiB,GAAoB;AAAA,EACzD,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,kCAAkC,IAAI;AAAA,EACtF,MAAM,YAAY,MAAM,GAAG,YAAY,OAAO,gBAAgB;AAAA,IAC5D,MAAM,cAAc,MAAM,YAAY,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,IAC9D,MAAI,KAAG,KAAK,QAAQ,SAAS,GAAG,IAAG,KAAK,kBAAkB,GAAG,CAAC,GAC9D,MAAI,KAAG,KAAK,QAAQ,SAAS,GAAG,IAAG,KAAK,YAAY,KAAK,CAAC,CAC5D,CAAC,EAAE,IAAI,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,IACrC,MAAM,SAAmB,CAAC;AAAA,IAC1B,MAAM,YAAyD,CAAC;AAAA,IAChE,WAAW,OAAO,aAAa;AAAA,MAC7B,MAAM,SAAS,aAAa,IAAI,gBAAgB;AAAA,MAChD,MAAM,UAAU,IAAI,WAAW,YAAY,OAAO,OAAO,gBAAgB,CAAC,IAAI,IAAI,OAAO,OAAO,gBAAgB,CAAC;AAAA,MACjH,MAAM,cAAc,IAAI,WAAW,aAAa,UAAU,SAAS;AAAA,MACnE,MAAM,YAAY,OAAO,IAAI,EAAE,IAAI;AAAA,QAAE,QAAQ,cAAc,UAAU;AAAA,QACnE,eAAe,cAAc,wDAAwD;AAAA,QACrF,kBAAkB,KAAK,QAAQ,cAAc,QAAQ;AAAA,QAAG,YAAY;AAAA,QAAM,kBAAkB;AAAA,QAAM,YAAY;AAAA,MAAI,CAAC,EAClH,MAAM,KAAG,KAAK,QAAQ,IAAI,MAAM,CAAC;AAAA,MACpC,IAAI,CAAC;AAAA,QAAa,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,MAC3C;AAAA,kBAAU,KAAK,EAAE,UAAU,IAAI,WAAW,QAAQ,IAAI,QAAQ,CAAC;AAAA,IACtE;AAAA,IACA,OAAO,EAAE,QAAQ,WAAW,OAAO,YAAY,OAAO;AAAA,GACvD;AAAA,EACD,WAAW,OAAO,UAAU;AAAA,IAAW,MAAM,8BAA8B,IAAI,UAAU,IAAI,QAAQ,OAAO;AAAA,EAC5G,MAAM,SAAQ,SAAS;AAAA,EACvB,IAAI,UAAS,UAAU,OAAO,QAAQ;AAAA,IACpC,IAAI;AAAA,MAAE,MAAM,OAAM,MAAM,SAAS,kBAAkB,GAAG,UAAU,MAAM;AAAA,MACtE,OAAO,OAAO;AAAA,MAAE,QAAQ,KAAK,uEAAuE,KAAK;AAAA;AAAA,EAC3G;AAAA,EACA,OAAO,UAAU;AAAA;AAGnB,eAAsB,YAAY,GAAkB;AAAA,EAClD,IAAI;AAAA,IAAE,MAAM,0BAA0B;AAAA,IACtC,OAAO,OAAO;AAAA,IAAE,QAAQ,KAAK,wEAAwE,KAAK;AAAA;AAAA,EAC1G,IAAI,CAAC,SAAS,wBAAwB;AAAA,IAAS;AAAA,EAC/C,UAAU;AAAA,EACV,MAAM,QAAQ,SAAS,eAAe,SAAS;AAAA,EAC/C,cAAc,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,WAAU,WAAW,MAAK,CAAC;AAAA,EAC3E,SAAS,YAAY,MAAM,KAAK,kBAAkB,EAAE,MAAM,CAAC,UAAmB,QAAQ,MAAM,qBAAqB,KAAK,CAAC,GACrH,SAAS,0BAA0B,IAAI;AAAA;AAG3C,eAAsB,WAAW,GAAkB;AAAA,EACjD,UAAU;AAAA,EACV,IAAI;AAAA,IAAQ,cAAc,MAAM;AAAA,EAChC,SAAS;AAAA,EACT,MAAM,UAAU,QAAQ,WAAW,WAAW;AAAA,EAC9C,MAAM,QAAQ,KAAK,CAAC,SAAS,IAAI,MAAM,SAAS,uBAAuB,IAAI,CAAC,CAAC;AAAA,EAC7E,MAAM,cAAc,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,EACnE,MAAM,MAAI,KAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,KAAK,YAAY,GAAG,cAAc,CAAC,CAAC;AAAA,EAClF,WAAW,OAAO,aAAa;AAAA,IAC7B,MAAM,gBAAgB,OAAO,IAAI,MAAM,GAAG,UAAU;AAAA,EACtD;AAAA,EACA,MAAM;AAAA,EACN,MAAM,SAAQ,SAAS;AAAA,EACvB,IAAI,UAAS,YAAY,QAAQ;AAAA,IAC/B,IAAI;AAAA,MAAE,MAAM,OAAM,MAAM,SAAS,kBAAkB,GAAG,YAAY,IAAI,CAAC,QAAQ,OAAO,IAAI,MAAM,CAAC,CAAC;AAAA,MAClG,OAAO,OAAO;AAAA,MAAE,QAAQ,KAAK,uEAAuE,KAAK;AAAA;AAAA,EAC3G;AAAA,EACA,MAAM,yBAAyB;AAAA,EAC/B,cAAc,CAAC;AAAA;;;ADxEjB,IAAM,sBAA2C;AAAA,EAC/C;AAAA,EAAoB;AAAA,EAAW;AAAA,EAAS;AAAA,EAAc;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAoB;AAAA,EAC1G;AAAA,EAAmB;AAAA,EAAsB;AAAA,EAAa;AAAA,EAAa;AAAA,EAAY;AAAA,EAAe;AAChG;AAAA;AASA,MAAM,QAAgC;AAAA,EAcP;AAAA,EAA0C;AAAA,EAbvE;AAAA,EACA;AAAA,EACQ,QAAkE;AAAA,EACzD,WAAW;AAAA,IAC1B,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EAEA,WAAW,CAAkB,SAA0C,cAAmC;AAAA,IAA7E;AAAA,IAA0C;AAAA;AAAA,OAEjE,MAAK,GAAmC;AAAA,IAC5C,IAAI,KAAK,UAAU;AAAA,MAAQ,MAAM,IAAI,MAAM,0CAA0C,KAAK,QAAQ;AAAA,IAClG,KAAK,QAAQ;AAAA,IACb,IAAI;AAAA,MACF,KAAK,aAAa,mBAAmB;AAAA,MACrC,KAAK,SAAS,gBAAgB;AAAA,MAC9B,KAAK,SAAS,WAAW;AAAA,MACzB,IAAI,SAAS;AAAA,QAA2B,MAAM,KAAK,aAAa,QAAQ;AAAA,MACxE,KAAK,SAAS,QAAQ;AAAA,MACtB,MAAM,KAAK,aAAa,aAAa;AAAA,MACrC,KAAK,SAAS,SAAS;AAAA,MACvB,MAAM,KAAK,aAAa,iBAAiB;AAAA,MACzC,KAAK,SAAS,UAAU;AAAA,MACxB,MAAM,KAAK,aAAa,aAAa;AAAA,MACrC,KAAK,aAAa,mBAAmB;AAAA,MACrC,KAAK,SAAS,gBAAgB;AAAA,MAC9B,KAAK,SAAS,mBAAmB;AAAA,MACjC,MAAM,KAAK,aAAa,sBAAsB;AAAA,MAC9C,KAAK,MAAM,MAAM,KAAK,aAAa,UAAU;AAAA,MAC7C,KAAK,SAAS,IAAI,MAAM;AAAA,QACtB,UAAU,KAAK,QAAQ,YAAY,SAAS;AAAA,QAC5C,MAAM,KAAK,QAAQ,QAAQ,SAAS;AAAA,QACpC,OAAO,KAAK,IAAI;AAAA,QAChB,aAAa,KAAK,QAAQ,eAAe;AAAA,MAC3C,CAAC;AAAA,MACD,KAAK,QAAQ;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,MAAM,KAAK,eAAe;AAAA,MAC1B,KAAK,QAAQ;AAAA,MACb,MAAM;AAAA;AAAA;AAAA,OAIJ,KAAI,GAAkB;AAAA,IAC1B,IAAI,KAAK,UAAU,UAAU,KAAK,UAAU,aAAa,KAAK,UAAU;AAAA,MAAY;AAAA,IACpF,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ,KAAK,KAAK;AAAA,IACvB,KAAK,SAAS;AAAA,IACd,KAAK,MAAM;AAAA,IACX,MAAM,KAAK,eAAe;AAAA,IAC1B,KAAK,QAAQ;AAAA;AAAA,OAGD,eAAc,GAAkB;AAAA,IAC5C,MAAM,UAAgC,CAAC;AAAA,IACvC,IAAI,KAAK,SAAS,eAAe;AAAA,MAC/B,KAAK,SAAS,gBAAgB;AAAA,MAC9B,QAAQ,KAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM,KAAK,aAAa,kBAAkB,CAAC,CAAC;AAAA,IAClF;AAAA,IACA,IAAI,KAAK,SAAS,kBAAkB;AAAA,MAClC,KAAK,SAAS,mBAAmB;AAAA,MACjC,QAAQ,KAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM,KAAK,aAAa,qBAAqB,CAAC,CAAC;AAAA,IACrF;AAAA,IACA,IAAI,KAAK,SAAS,SAAS;AAAA,MACzB,KAAK,SAAS,UAAU;AAAA,MACxB,QAAQ,KAAK,KAAK,aAAa,YAAY,CAAC;AAAA,IAC9C;AAAA,IACA,IAAI,KAAK,SAAS,QAAQ;AAAA,MACxB,KAAK,SAAS,SAAS;AAAA,MACvB,QAAQ,KAAK,KAAK,aAAa,YAAY,CAAC;AAAA,IAC9C;AAAA,IACA,IAAI,KAAK,SAAS,OAAO;AAAA,MACvB,KAAK,SAAS,QAAQ;AAAA,MACtB,QAAQ,KAAK,KAAK,aAAa,WAAW,CAAC;AAAA,IAC7C;AAAA,IACA,IAAI,KAAK,SAAS,UAAU;AAAA,MAC1B,KAAK,SAAS,WAAW;AAAA,MACzB,QAAQ,KAAK,KAAK,aAAa,cAAc,CAAC;AAAA,IAChD;AAAA,IACA,IAAI,KAAK,SAAS,eAAe;AAAA,MAC/B,KAAK,SAAS,gBAAgB;AAAA,MAC9B,QAAQ,KAAK,KAAK,aAAa,kBAAkB,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAEpC;AAEO,SAAS,aAAa,CAC3B,UAA0B,CAAC,GAC3B,eAAoC,qBACtB;AAAA,EACd,OAAO,IAAI,QAAQ,SAAS,YAAY;AAAA;;;AEhJ1C,IAAM,UAAU,cAAc;AAC9B,IAAM,SAAS,MAAM,QAAQ,MAAM;AACnC,QAAQ,IAAI,sBAAsB,OAAO,KAAK;AAE9C,IAAI,eAAe;AACnB,eAAe,QAAQ,GAAkB;AAAA,EACvC,IAAI;AAAA,IAAc;AAAA,EAClB,eAAe;AAAA,EACf,QAAQ,IAAI,wBAAwB;AAAA,EACpC,MAAM,QAAQ,KAAK;AAAA;AAGrB,QAAQ,GAAG,UAAU,MAAM,KAAK,SAAS,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC;AACtE,QAAQ,GAAG,WAAW,MAAM,KAAK,SAAS,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC;",
39
+ "debugId": "B06EF4172FD68CC564756E2164756E21",
40
+ "names": []
41
+ }